基函数析构函数virtual

mac2026-10-02  6

第一种代码:基函数析构函数无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

最新回复(0)