关于c++析构函数要不要加virtual的问题

1.析构函数加virtual

#include <iostream>

using namespace std;

class CA {
public:
    CA() { cout << "CA()" << endl; }
    virtual ~CA() { cout << "~CA()" << endl; }
};

class CB : public CA {
public:
    CB() { cout << "CB()" << endl; }
    ~CB() { cout << "~CB()" << endl; }
};

int main() {
    cout << "Hello, World!" << endl;
    CA *pa = new CB();
    delete pa;

    return 0;
}

输出:

Hello, World!
CA()
CB()
~CB()
~CA()

2.析构函数不加virtual

#include <iostream>

using namespace std;

class CA {
public:
    CA() { cout << "CA()" << endl; }
    ~CA() { cout << "~CA()" << endl; }
};

class CB : public CA {
public:
    CB() { cout << "CB()" << endl; }
    ~CB() { cout << "~CB()" << endl; }
};

int main() {
    cout << "Hello, World!" << endl;
    CA *pa = new CB();
    delete pa;

    return 0;
}

输出:

Hello, World!
CA()
CB()
~CA()

3.子类指向自身的析构

#include <iostream>

using namespace std;

class CA {
public:
    CA() { cout << "CA()" << endl; }
    ~CA() { cout << "~CA()" << endl; }
};

class CB : public CA {
public:
    CB() { cout << "CB()" << endl; }
    ~CB() { cout << "~CB()" << endl; }
};

int main() {
    cout << "Hello, World!" << endl;
    CB *pb = new CB();
    delete pb;

    return 0;
}

输出:

Hello, World!
CA()
CB()
~CB()
~CA()

结论:
c++中析构函数加virtula的话, 在父类指向子类的指针析构时, 会调用子类的析构.
如不加virtual,则不会调用子类的析构.
以上在父类指向子类指针时生效. 删除子类指向自身的对象时,父类加或不加virtual, 父类的析构依然会调用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值