C++之虚析构函数
2015-03-19 11:08
218 查看
代码一、
#include <iostream> using namespace std; class Base { public: Base(){}; ~Base() { cout << "Base destructor." << endl; }; }; class Derive : public Base { public: Derive(){}; ~Derive() { cout << "Derive destructor." << endl; }; }; int main(int argc, char **argv) { cout << "delete pBase" << endl; Base *pBase = new Derive(); delete pBase; cout << "delete pDerive" << endl; Derive *pDerive = new Derive(); delete pDerive; return 0; }
运行结果:
代码二、
#include <iostream> using namespace std; class Base { public: Base(){}; virtual ~Base() { cout << "Base destructor." << endl; }; }; class Derive : public Base { public: Derive(){}; ~Derive() { cout << "Derive destructor." << endl; }; }; int main(int argc, char **argv) { cout << "delete pBase" << endl; Base *pBase = new Derive(); delete pBase; cout << "delete pDerive" << endl; Derive *pDerive = new Derive(); delete pDerive; return 0; }
运行结果:
结论:
基类的析构函数是为了,删除指向派生类对象的基类指针时,会调用派生类的析构函数。只要派生类析构函数被调用,之后必定调用基类的析构函数。
疑问:按照C++的内存布局,虚函数是由放在虚函数表中的函数指针指向的,由函数指针间接调用的。而且派生类中如果定义了虚函数,那么虚函数表中相应存放指向基类虚函数的指针就会被指向派生类虚函数的指针替换。以此实现多态,即用基类指针调用派生类函数。
但是析构函数是特殊呢,因为派生类的析构函数和基类的析构函数并不重名,因此可能不是这样处理的,此处还需要深究。
相关文章推荐
- C++中的虚析构函数
- 跟风C++主题年:从虚析构函数想到的内存基本模型
- C++虚函数的实现细节、虚析构函数 汇编解析
- C++虚析构函数
- C++继承中的虚析构函数
- c++基类不为虚析构函数的一个风险
- c++ virtual 虚析构函数 资源释放的讨论
- C++继承中构造函数、析构函数调用顺序及虚析构函数
- C++中 虚函数 虚析构函数的作用
- C++中的虚析构函数
- c++继续学习 virtual Destruct function (虚析构函数)
- 关于C++虚析构函数
- c++面向接口编程,虚函数,虚析构函数
- 关于c++虚析构函数
- C++中的虚析构函数
- C++中,什么是纯虚函数,什么是抽象类,什么是虚析构函数
- C++中的虚析构函数
- c++只在基类中用虚析构函数的原因
- C++的虚析构函数
- C++虚析构函数