blog.youkuaiyun.com/tianmo2010/article/details/8706209
构造函数可以调用虚函数吗?语法上通过吗?语义上可以通过吗?
C++是不允许虚构造函数。
测试代码:
- class A
- {
- public:
- virtual A()
- {
- cout<<"sgsfsdfasf";
- }
- private:
- int x;
- };
- int main()
- {
- A a;
- return 0;
- }
我就去找了一下为什么。下面是找到的一点信息。
虚构造函数是有用的,最常见的情况就是持久化支持。将对象从持久化源中取出来就非常需要一种类似虚构造函数的 机制 。事实上我们通常用设计模式来做到这一点,那就是abstract factory。
c++不支持虚构造函数的原因说来既简单又复杂:
1、简单的说,c++中没有实现虚构造函数的简单方法。实现虚构造函数必然要依赖于某种运行时反射机制,而c++只有最弱的rtti机制,实现这种反射需要付出的代价相当昂贵,从速度到空间都有。
2、复杂的说,虚构造函数与c++的现有体系是非自谐的。虽然c++基本上是一个实用主义 语言 ,自谐从来不是它的目标,比如与c的兼容性就非常影响它的自谐性,但一个与整个体系的方向相背离的特性对整个语言是一种严重的伤害。所谓违背自谐,简单的理解就是,它会影响已有的特性。
c++之父已经说过,“虚拟”构造函数,可以轻易绕过去。
在构造函数里,调用一个虚函数来执行真正的初始化动作即可。
虚函数是动态绑定的,也就是说,使用虚函数的指针和引用能够正确找到实际类的对应函数,而不是执行定义类的函数。
构造函数不能是虚函数。而且,在构造函数中调用虚函数,实际执行的是父类的对应函数,因为自己还没有构造好, 多态是被disable的。
另外,析构函数允许为虚并且往往是必要的。