第一种代码:基函数析构函数无virtual
#include<iostream> class A { public: A() { printf(" 创建A \n"); } ~A() { printf(" 销毁A \n"); } // 增加了虚拟关键字 }; class B : public A { public: B() { printf("创建B \n"); } ~B() { printf("销毁B \n"); } }; int main(int argc, char* argv[]) { A* a = new B; delete a; getchar(); return 0; }执行结果:
第二种代码:基函数析构函数有virtual
#include<iostream> class A { public: A() { printf(" 创建A \n"); } virtual ~A() { printf(" 销毁A \n"); } // 增加了虚拟关键字 }; class B : public A { public: B() { printf("创建B \n"); } ~B() { printf("销毁B \n"); } }; int main(int argc, char* argv[]) { A* a = new B; delete a; getchar(); return 0; }运行结果:
3.子类对象初始化
#include<iostream> class A { public: A() { printf(" 创建A \n"); } virtual ~A() { printf(" 销毁A \n"); } // 增加了虚拟关键字 }; class B : public A { public: B() { printf("创建B \n"); } ~B() { printf("销毁B \n"); } }; int main(int argc, char* argv[]) { B* a = new B; delete a; getchar(); return 0; }运行结果:
结论:析构函数本应该设置成虚函数。在父类指针指向子类对象做对象销毁时,由于析构函数不是虚函数,则delete时,父类指针只能调用父类自己的析构函数,这就造成了上述对象部分销毁的错误状况。
参考:
1.https://blog.csdn.net/z735640642/article/details/84351451
2.https://blog.csdn.net/weixin_39731083/article/details/81739340
