[C++基础]023_为什么要将基类的析构函数声明为Virtual?
2013-03-19 14:38
204 查看
[C++基础]023_为什么要将基类的析构函数声明为Virtual?
#include <iostream> using namespace std; class Father{ public: ~Father(){ cout<<"Father's Desconstruct Called."<<endl; } }; class Son : public Father{ public: ~Son(){ cout<<"Son's Desconstruct Called."<<endl; } }; int main(){ Father *f = new Son(); delete f; system("pause"); return 0; }
上面的代码,用父类指针指向new出来来的之类对象,这样是没问题的,接着,对这个父类指针变量进行了delete操作。上面的输出结果是什么呢?
Father's Desconstruct Called.
可见,子类的析构函数没有被调用,那如果子类中new了内存,那么那块内存就丢了。如何保证在删除父类指针的时候,子类的析构函数也被调用呢?看如下代码:
#include <iostream> using namespace std; class Father{ public: virtual ~Father(){ cout<<"Father's Desconstruct Called."<<endl; } }; class Son : public Father{ public: ~Son(){ cout<<"Son's Desconstruct Called."<<endl; } }; int main(){ Father *f = new Son(); delete f; system("pause"); return 0; }
输出是什么呢?
Son's Desconstruct Called. Father's Desconstruct Called.
这就是动态联编的析构函数,至于为什么这样就可以调用子类的析构函数了,这就牵涉到另一个概念:虚函数表。具体请参照:/article/2052881.html
相关文章推荐
- [C++基础]023_为什么要将基类的析构函数声明为Virtual?
- [转]c++ 为什么要将基类的析构函数声明为Virtual?
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++里父类的析构函数为什么声明为virtual
- C++将多态基类的析构函数声明为virtual的作用
- c++之Item7在多态基类中将析构函数声明为virtual
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- C++中基类的析构函数为什么要用virtual虚析构函数
- effect C++ 为多态基类声明virtual 析构函数
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
- c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数?
- 若使用基类指针delete派生类对象,需将基类和派生类的析构函数声明为virtual