Why destruct function should always virtual
举个例子,考虑下面一段程序:
1 class base
2 {
3 public:
4 ~base() { cout<<"in base destruct function!\n"; }
5 };
6
7 class derived: public base
8 {
9 public:
10 ~derived() {cout<<"in derived destruct function!\n"; }
11 };
12 int main()
13 {
14 base *pBase = (base *)new derived();
15 delete pBase;
16 }
2 {
3 public:
4 ~base() { cout<<"in base destruct function!\n"; }
5 };
6
7 class derived: public base
8 {
9 public:
10 ~derived() {cout<<"in derived destruct function!\n"; }
11 };
12 int main()
13 {
14 base *pBase = (base *)new derived();
15 delete pBase;
16 }
输出结果:in base destruct function!
pBase指向derived类型对象,delete时只调用了父类的析构函数,这是不正确的做法。
而把析构函数定义为virtual的,就不会存在这个问题,输出结果为
in derived destruct function!
in base destruct function!
delete该对象时会先调用子类析构函数再调用父类析构函数。