析构函数为什么要定义成虚析构函数?
2016-12-19 22:36
239 查看
通常,如果想通过指向某个对象基类的指针操纵这个对象(也就是,通过它的一般接口操纵这个对象),会发生什
么现象?当我们用delete用new创建的对象指针时,就会出现这个问题。如果这个指针是指向基类的,在delete期间,编
译器只能知道调用这个析构函数的基类版本。虚函数被创建恰恰是为了解决同样的问题。(除了构造函数以外的所有
函数都可以是虚函数,析构函数可以是虚函数,构造函数不能是虚函数)。
#include<iostream> using namespace std; class Base1 { public: ~Base1(){cout<<"~Base1()"<<endl;} }; class Derived1:public Base1 { public: ~Derived1(){cout<<"~Derived1"<<endl;} }; class Base2 { public: virtual ~Base2(){cout<<"Base2()"<<endl;} //虚析构函数; }; class Derived2:public Base2 { public: ~Derived2(){cout<<"Derived2()"<<endl;} }; void main() { Base1 *bp=new Derived1; delete bp; Base2 *b2p=new Derived2; delete b2p; }
当运行这个程序,将会看到delete bp只调用了基类的析构函数,delete b2p调用了派生类的析构函数,然后调用
基类的析构函数。这正是我们希望的。不把析构函数设为虚函数是一个隐匿的错误,因为它常常不会对程序有直接影
响。但它会引起内存泄漏(关闭程序时,内存未释放)。同样的析构操作还有可能掩盖发生的问题。
相关文章推荐
- 为什么有时候需要把析构函数定义为虚函数
- (1)为什么构造函数的名字用类名?(2)构造函数返回值问题;(3)析构函数和构造函数定义为虚函数;
- 为什么析构函数定义为虚函数
- 为什么有时类的析构函数要定义为protected呢?
- 为什么要将析构函数定义为虚函数
- 为什么基类的析构函数定义为虚函数?
- C++析构函数为什么要定义成虚函数
- 为什么要把父类的析构函数定义成虚函数?
- C++笔记之为什么一个类定义了析构函数就几乎肯定要定义拷贝构造函数和拷贝赋值运算符
- 为什么有时类的析构函数要定义为protected呢?
- 为什么要把父类的析构函数定义成虚函数?
- 从为什么要将基类的析构函数定义为虚函数谈起~~
- 为什么析构函数可以为虚函数,什么情况下需要将析构函数定义为虚函数?
- 为什么有时类的析构函数要定义为protected呢?
- 为什么要把父类的析构函数定义成虚函数
- 为什么要把父类的析构函数定义成虚函数?
- 为什么需要定义虚的析构函数?
- 关于父类析构函数为什么要定义为虚函数_boolan_第二门课_第一周
- 为什么需要将继承层次中类的析构函数定义成virtual的?
- 为什么有时类的析构函数要定义为protected呢?