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年前关闭。
请参见以下代码:
由于没有从
我可以通过为
因为
语言要求永远/永远不能调用代码的原因是什么?
(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