This question already has an answer here:
In an abstract class constructor, why I do need to call a constructor of a virtual base that will never to called?

(1个答案)


5年前关闭。




请参见以下代码:
struct Object;

struct Component
{
    Component(Object* obj) { }
};

struct Renderable : public virtual Component
{
    virtual void Render() = 0;
};

struct AnimationRenderer : public Renderable
{
    AnimationRenderer(Object* obj) : Component(obj) { }
    virtual void Render() { }
};

由于没有从Component::Component()Renderable::Renderable()的匹配调用,因此无法编译。

我可以通过为Renderable提供构造函数(例如Renderable() : Component(NULL) { })来使此示例工作,即使Renderable将永远无法初始化组件

因为Renderable是抽象类,所以永远不能直接实例化它。因为它实际上是从Component继承的,所以它将永远无法调用Component的初始化。

语言要求永远/永远不能调用代码的原因是什么?

最佳答案

实际上,该语言不需要这样做。您的编译器没有使用当前的C++规则。

12.6.2p8说(以黑体字强调):



我在C++ 03中找不到该规则,因此这是C++中公认的缺陷,此缺陷已得到修复。寻找支持C++ 11的编译器更新。

我可以找到的C++ 03中最接近的相关规则在12.6.2p6节中:

07-27 20:08