为什么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 |
但是,析构函数一般都需要加上virtual,假如定义Base *b = new Deriver; Deriver是Base的子类,并且~Base()不为virtual。那么当对象被注销时,系统只会调用~Base(),而不会调用~Deriver(),因为b是Base类型,已被静态绑定析构函数。如果基类或子类用new创建了内存空间,就必须通过析构函数销毁。因此必须使用vitual析构函数,实现动态绑定。
相关文章推荐
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数?
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数
- C++中为什么析构函数可以是虚函数,而构造函数不可以是虚函数?
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么不能把构造函数设为虚函数,却可以把析构函数设为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能虚而析构函数可以虚,以及在什么情况下来使用析构函数
- C++中为什么构造函数不能是虚函数,析构函数是虚函数
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数?