【发布时间】:2015-11-30 18:47:58
【问题描述】:
令我惊讶的是,以下 C++ 代码无法编译。
class InterfaceA {
public:
virtual void Foo() = 0;
};
class InterfaceB : public InterfaceA {
public:
virtual void Bar() = 0;
};
class ImplementationA : public InterfaceA {
public:
void Foo() override {}
};
class ImplementationB : public ImplementationA, public InterfaceB {
public:
void Bar() override {}
};
int main() {
ImplementationB b;
b.Bar();
}
抽象类类型“ImplementationB”的对象是不允许的: 纯虚函数“InterfaceA::Foo”没有覆盖器。 错误 C2259 'ImplementationB': 无法实例化抽象类。
是否可以从实现A继承纯虚方法的实现而无需将实现B中的方法Foo重新定义为:
void Foo() override {
ImplementationA::Foo();
}
如果不是,那为什么?
【问题讨论】:
-
C++ 与 Java 不同。这个问题已经被问过好几次了。
-
我认为这里的答案比上面引用的副本中的答案要好。这些答案没有提到虚拟继承,因为另一个问题中指定的问题不像这里的问题那样从具有共同祖先的类继承。问题并不完全相同(这个问题回答了我在这里找到方法时遇到的问题,而另一个没有)。
标签: c++ inheritance abstract-class virtual c++14