【C++】基类析构函数要写成虚函数

基类析构函数要写成虚函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值