基类析构函数要写成虚函数
Base* p = new Derived();
delete p;
只会调用~Base()不会调用~Derived()
析构函数中不可能发生多态行为
在析构函数执行时,虚函数表指针已经被销毁
https://blog.csdn.net/lsy0607/article/details/101720134
(1)构造函数中不可能发生多态行为,在构造函数执行时,虚函数表指针未被正确初始化。
(2)析构函数中不可能发生多态行为,在析构函数执行时,虚函数表指针已经被销毁。
https://blog.csdn.net/qq_53958979/article/details/122776094
https://www.cnblogs.com/xietianjiao/p/12859095.html
多重构造时候的虚构造函数
case1:
A,B类中均虚析构函数
class A
{
public:
A() { cout << "A constructor" << endl; }
virtual ~A() { cout << "A destructor" << endl; } //virtual
};
class B
{
public:
B() { cout << "B constructor" << endl; }
virtual ~B() { cout << "B destructor" << endl; }
};
class C :public A, public B
{
public:
C() { cout << "C constructor" << endl; }
~C() { cout << "C destructor" << endl; }
};
int main() {
B* pa = new C;
delete pa;
return 0;
}
输出
A constructor
B constructor
C constructor
C destructor
B destructor
A destructor
case2:
A,B类中只有一个是虚构造
class A
{
public:
A() { cout << "A constructor" << endl; }
~A() { cout << "A destructor" << endl; } // 去掉virtual
};
class B
{
public:
B() { cout << "B constructor" << endl; }
virtual ~B() { cout << "B destructor" << endl; }
};
class C :public A, public B
{
public:
C() { cout << "C constructor" << endl; }
~C() { cout << "C destructor" << endl; }
};
int main() {
B* pa = new C;
// A* pa = new C; 出错
delete pa;
return 0;
}
输出
A constructor
B constructor
C constructor
C destructor
B destructor
A destructor
无论多重继承中的基类任然需要遵循Effective C++中基类的设计原则—如果一个类被作为基类使用,需要提供虚析构函数。
对于多重继承中没有虚析构的基类,如果用基类指针操作子类对象那么会出现资源泄露
多重继承
B:A
C:B
情况?TBD