论坛首页· 友情链接申请·申请版主· 广告投放· 道具中心· 设为首页· 收藏本站
发新话题
打印

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

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

刚才试了一下,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的

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

TOP

恩,以前还没注意到这个问题。。。
从易做事,从简做人。埋头做事,低头做人。不予他求,只扪自力。休言酸骚,命运求己。

TOP

从来没想过这个东西!

TOP

通过一个已知的对象直接调用(就是说不是通过指针或者引用)虚函数的话,编译器很有可能会省略掉运行时虚函数的查表过程。
有些情况下运行时多态可以用模板实现的编译期多态代替,ATL就用到了这个技巧

TOP

回复

以前真没想过,学习了

TOP

发新话题