比方说,我有以下类层次结构,其中有一个接口,然后该接口的进一步专门化保证了更多功能:
class parent_interface {
public:
virtual void foo() = 0;
};
class child1_interface : public parent_interface {
public:
virtual void bar() = 0;
};
class child2_interface : public parent_interface {
public:
virtual void baz() = 0;
}
然后我有提供该功能的具体类:
class parent : public parent_interface {
public:
void foo() override;
};
class child1 : public parent, public child1_interface {
public:
//using parent::foo; ??
void bar() override;
};
问题是,如果我尝试实例化child1对象,则会收到编译器错误
无法声明字段
instantiation_name
为抽象类型,因为以下虚拟函数在child1中是纯净的:void foo()
我可以通过在child1内创建一个名为foo的方法来解决此问题,该方法仅调用parent :: foo,但我想知道是否存在针对此问题的更干净的解决方案。
答案 0 :(得分:1)
您需要指定virtual
继承,以便编译器知道将基类重新组合为一个。这应该为您编译(see it work):
class parent_interface {
public:
virtual void foo() = 0;
};
class child1_interface : public virtual parent_interface {
public:
virtual void bar() = 0;
};
class parent : public virtual parent_interface {
public:
void foo() override
{
}
};
class child1 : public parent, public child1_interface {
public:
//using parent::foo; ??
void bar() override
{
}
};
有关更多信息,您可以在此处阅读有关Virtual Base Classes的信息。