构造函数调用虚函数

blog.csdn.net/tianmo2010/article/details/8706209

构造函数可以调用虚函数吗?语法上通过吗?语义上可以通过吗?

C++是不允许虚构造函数
测试代码

  1. class A   
  2. {   
  3. public:   
  4.         virtual A()  
  5.         {  
  6.                 cout<<"sgsfsdfasf";  
  7.         }  
  8. private:   
  9.         int x;  
  10. };  
  11. int main()  
  12. {  
  13.         A a;  
  14.         return 0;  
  15. }  
错误信息:error C2633: 'A' : 'inline' is the only legal storage class for constructors
我就去找了一下为什么。下面是找到的一点信息。

虚构造函数是有用的,最常见的情况就是持久化支持。将对象从持久化源中取出来就非常需要一种类似虚构造函数的 机制 。事实上我们通常用设计模式来做到这一点,那就是abstract   factory。   
  c++不支持虚构造函数的原因说来既简单又复杂:   
  1、简单的说,c++中没有实现虚构造函数的简单方法。实现虚构造函数必然要依赖于某种运行时反射机制,而c++只有最弱的rtti机制,实现这种反射需要付出的代价相当昂贵,从速度到空间都有。   
  2、复杂的说,虚构造函数与c++的现有体系是非自谐的。虽然c++基本上是一个实用主义 语言 ,自谐从来不是它的目标,比如与c的兼容性就非常影响它的自谐性,但一个与整个体系的方向相背离的特性对整个语言是一种严重的伤害。所谓违背自谐,简单的理解就是,它会影响已有的特性。

c++之父已经说过,“虚拟”构造函数,可以轻易绕过去。   
在构造函数里,调用一个虚函数来执行真正的初始化动作即可。
虚函数是动态绑定的,也就是说,使用虚函数的指针和引用能够正确找到实际类的对应函数,而不是执行定义类的函数。
构造函数不能是虚函数。而且,在构造函数中调用虚函数,实际执行的是父类的对应函数,因为自己还没有构造好, 多态是被disable的。

另外,析构函数允许为虚并且往往是必要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值