迎风的舵手

勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏.

关于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, 父类的析构依然会调用.

阅读更多
版权声明:http://blog.csdn.net/robertkun https://blog.csdn.net/robertkun/article/details/79215096
文章标签: 析构函数 virtual
个人分类: 沏杯茶
上一篇C++的构造和析构顺序
下一篇golang使用aes库实现加解密
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭