您的位置:首页 > 编程语言 > C语言/C++

为什么C++不能有虚构造函数,却可以有虚析构函数

2012-04-30 20:02 260 查看
class B{
public :
virtual void m1();
virtual void m2();
};
class D : public B{
virtual void m1();
}


有天参加某大公司笔试,遇到这个问题,回来重新翻看C++教材和网上找答案,才恍然大悟。答案如下:

C++的动态绑定使用vtable(虚成员函数表)来实现。vtable支持运行时查询,使系统可以将某一函数名绑定到vtable的特定入口地址。

例如上段代码的虚函数表为:

虚成员函数       入口地址虚成员函数            入口地址
B::m1              0x7723 D::m1                    0x99a7
B::m2              0x23b4 D::m2                   0x23b4
由于系统执行虚函数时,要从对象的vtable找到函数入口地址,而且vtable是存储于对象的内存空间中。假如对象没有实例化,就找不到vtable。因此,构造函数不能是vittual。

但是,析构函数一般都需要加上virtual,假如定义Base *b = new Deriver; Deriver是Base的子类,并且~Base()不为virtual。那么当对象被注销时,系统只会调用~Base(),而不会调用~Deriver(),因为b是Base类型,已被静态绑定析构函数。如果基类或子类用new创建了内存空间,就必须通过析构函数销毁。因此必须使用vitual析构函数,实现动态绑定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ class 存储 c
相关文章推荐