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

c++中为什么不允许虚构造函数?

2011-04-27 13:59 176 查看
刚才试了一下,c++确实不允许虚构造函数。
测试代码:

class A
{
public:
virtual A()
{
cout<<"sgsfsdfasf";
}
private:

int x;

};

int main()
{
A a;
return 0;
}

错误信息: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的

另外,析构函数允许为虚并且往往是必要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: