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

版权声明:http://blog.csdn.net/robertkun https://blog.csdn.net/robertkun/article/details/79215096

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

阅读更多
换一批

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