以下是否合法?
class Base {
virtual void foo() = 0;
};
class Fooable {
void foo(){}
};
class Child : public Base, public Fooable {
};
如果一个类继承自两个都有foo()
的类,会发生什么?如果Base::foo()
不抽象怎么办?
答案 0 :(得分:2)
由于foo在Base中是虚拟的,如果你没有在Child中实现foo(),那么如果你试图实例化Child,编译就会失败,因为Child仍然是抽象的。
如果Base :: foo()不是抽象的,你需要指定你调用的foo,如下所示:
Child *child = new Child;
child->Base::foo()
; child->Fooable::foo()
答案 1 :(得分:0)
由于Base
和Fooable
没有评论虚拟基础,当您从这两个版本继承时,您将获得两个独立的foo
函数,尽管它们具有同名。
您可以使用常见的虚拟基类来执行您想要的操作:
class Base {
virtual void foo() = 0;
};
class Fooable : public virtual Base {
void foo(){}
};
class Child : public virtual Base, public virtual Fooable {
};
虽然如果您希望能够拨打foo
,您需要将其设为公开而非私密。