现在的位置: 首页 > 综合 > 正文

虚析构函数

2013年10月16日 ⁄ 综合 ⁄ 共 929字 ⁄ 字号 评论关闭

类: C++ 权限: 公开 
#include <iostream>
using namespace std;
class Base
{
public: Base()
{
cout<<"constructor in Base"<<endl;
};
virtual void func(void)
{
cout<<"Do in Base!"<<endl;
};
virtual ~Base()
{
cout<<"destructor in Base"<<endl;
};
};
class Derived:public Base
{

public: Derived()
{
cout<<"constructor in Derived"<<endl;
};
void func(void)
{
cout<<"Do in Derived!"<<endl;
};
~Derived()
{
cout<<"destructor in Derived!"<<endl;
}
};
int main(void)
{
Base *p = new Derived;
p->func();
delete 构造函数不能用虚拟,因为用也没用,不管是在栈上构造对象,还是在堆上构造对象,也不管你以后是否使用父类的指针或引用来指向或引用这个对象,在构造的那“一瞬间”,总归要指明要构造对象的具体类型,所以,对象在构造过程中不存在运行时动态绑定的多态行为。 
你理解这个意思吗?举了例子就明白了,通常,假如A是B的父类, 
A* p = new B(); 
则对于虚拟函数f,可以通过A类的指针p直接调用到B类的函数,这就是运行时的多态: 
p->f(); 
但你注意没有,B类的对象却必须通过“A* p = new B();”来构造,显然不能通过“A* p = new A();”来构造一个B类对象——这是荒唐的,这只能构造一个A类的对象。所以构造函数虚拟无意义。 
但析构函数就不同了,p明明是个A类的指针,如果析构函数不是虚拟的,那么,你后面就必须这样才能安全的删除这个指针: 
delete (B*)p; 
但如果构造函数是虚拟的,就可以在运行时动态绑定到B类的析构函数,直接: 
delete p; 
就可以了。这就是虚析构函数的作用。而事实上,在运行时,你并不是总是能知道p所指对象的实际类型从而进行强制转换,所以,C++语言既然要支持多态,也就必须支持虚拟析构。

抱歉!评论已关闭.