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的
另外,析构函数允许为虚并且往往是必要的。
测试代码:
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的
另外,析构函数允许为虚并且往往是必要的。
相关文章推荐
- 在C++中,为什么构造函数不能有返回值?
- C++里的构造函数为什么不能为虚函数
- 【c++】构造函数为什么不能是虚函数
- c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数?
- 为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数
- C++中构造函数为什么不能为虚函数
- C++ 为什么类的构造函数可以访问类的私有成员?解惑
- 为什么不允许从enum的构造函数中引用static变量?
- C++中为什么构造函数不能是虚函数,析构函数是虚函数
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- C++ - 为什么析构函数不允许抛出异常
- C++:类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)
- C++中构造函数初始化列表为什么会比构造函数中赋值要高效
- C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?
- C++中为什么不允许通过返回类型重载函数的辩论
- C++的构造函数为什么不能是虚函数
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- C++中的构造函数为什么没有返回值
- 为什么C++不能有虚构造函数,却可以有虚析构函数
- C++之构造函数为什么不能为虚函数