虚析构函数
来源:互联网 发布:apache启动和停止命令 编辑:程序博客网 时间:2024/06/06 04:22
虚析构函数
@(C++实践)
很多书里都有说过,要把基类的析构函数声明为virtual,那么为什么呢?
看下面这个例子:
class Base{public: Base(){ std::cout << "Base::Base()" << std::endl; } ~Base(){ std::cout << "Base::~Base()" << std::endl; } virtual void fun() { std::cout << "Base::fun()" << std::endl; }};class Derived : public Base { public: Derived() { std::cout << "Derived::Derived()" << std::endl; } ~Derived(){ std::cout << "Derived::~Derived()" << std::endl; } void fun() { std::cout << "Derived::fun()" << std::endl; } }; int main(int argc, const char* argv[]) { Base* pb = new Base(); Base* pd = new Derived(); pb->fun(); pd->fun(); delete pb; delete pd; return 0; }
程序看似没有什么问题,new的指针都delete掉了,但是执行起来:
Base::Base()Base::Base()Derived::Derived()Base::fun()Derived::fun()Base::~Base()Base::~Base()
怎么delete pd这个指针只调用了基类的析构函数啊。这岂不是个天坑。
对此只要把基类的析构函数声明为virtual即可,看下虚析构函数下的输出结果:
Base::Base()Base::Base()Derived::Derived()Base::fun()Derived::fun()Base::~Base()Derived::~Derived()Base::~Base()
delete pd的时候,它很机智的先执行了派生类的析构函数,然后执行了基类的析构函数。
阅读全文
0 0
- 虚析构函数、纯虚析构函数
- 虚析构函数,纯虚析构函数~~~
- 构造函数 虚函数 虚析构函数
- 虚析构函数、纯虚析构函数、虚构造函数
- 纯虚函数、虚函数、虚析构函数
- 虚析构函数、纯虚析构函数、虚构造函数
- 虚函数,虚析构函数,虚函数表
- 虚析构函数、纯虚析构函数、虚构造函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- 虚析构函数
- HDU 3656 Fire station(巧妙的二分+DLX重复覆盖)
- css 盒子模型理解
- 设计模式读书笔记-----迭代器模式
- 10.1日NOIP模拟赛
- 偏差与方差,欠拟合与过拟合
- 虚析构函数
- 设计模式
- Keyboard Row
- 分子量
- C++使用: C++中map的基本操作和用法
- 训练日记-27
- UVa133 The Dole Queue
- Windows下使用django做website(创建第一个django工程并使用pycharm打开执行)
- HDU