通常,如果想通过指向某个对象基类的指针操纵这个对象(也就是,通过它的一般接口操纵这个对象),会发生什
么现象?当我们用delete用new创建的对象指针时,就会出现这个问题。如果这个指针是指向基类的,在delete期间,编
译器只能知道调用这个析构函数的基类版本。虚函数被创建恰恰是为了解决同样的问题。(除了构造函数以外的所有
函数都可以是虚函数,析构函数可以是虚函数,构造函数不能是虚函数)。
- <span style="font-size:18px;">#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;
- }</span>
当运行这个程序,将会看到delete bp只调用了基类的析构函数,delete b2p调用了派生类的析构函数,然后调用
基类的析构函数。这正是我们希望的。不把析构函数设为虚函数是一个隐匿的错误,因为它常常不会对程序有直接影
响。但它会引起内存泄漏(关闭程序时,内存未释放)。同样的析构操作还有可能掩盖发生的问题。
联系客服