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