在C++中使用虚拟析构函数(除了解构顺序正确性)

-2 c++ virtual virtual-destructor

每个C++程序员都知道,虚拟析构函数用于确保继承层次结构中对象的正确销毁顺序.

在哪里使用"虚拟析构器"/可以在实时场景中使用?

Mar*_*som 5

你的假设不正确; 幸福virtual不会影响破坏的秩序.这总是从大多数派生到基类.它确实会影响实际调用哪些析构函数!如果你没有声明析构函数是虚拟的,那么从大多数派生的析构函数开始的完整的析构函数链可能永远不会被调用.

如果没有虚拟析构函数,调用链将以指针或引用的静态类型的最派生类开始.如果您的实际对象是一个更多的派生类型,那么将会有未定义的行为,因为这些析构函数被跳过.

例如:

class A { ... }; // base class
class B: public A { ... }; // derived class
class C: public B { ... }; // further derived

A* ABCFactory() { return new C; }

A* a = ABCFactory();
delete a;            // undefined behavior as destructors C and B are skipped
Run Code Online (Sandbox Code Playgroud)