我有3个这样的接口(纯虚拟)类
class A {
virtual void M1() = 0;
virtual void M2() = 0;
};
class B : public A {
virtual void M3() = 0;
};
class C : public A {
virtual void M4() = 0;
};
我有像这样的实施者
class Aimpl : A {
void M1 () override {};
void M2 () override {};
}
class Bimpl: public Aimpl, public B{
void M3() override {};
}
class Cimpl: public Aimpl, public C{
void M4() override {};
}
和
Bimpl b = Bimpl();
b.M2() // Error. M2 is ambigous. Can be from Aimpl or A
解决这个问题的简单方法是什么?我希望能够在函数中传递B或C而不是Bimpl
答案 0 :(得分:1)
基本上,M2
中有两种不同的Bimpl
方法:Aimpl::M2
和B::M2
。您已遇到diamond-inheritance problem。
要修复它,您应该使用虚拟继承。 This question提供了非常好的概述。基本上,你应该使用这样的东西:
class A {
virtual void M1() = 0;
virtual void M2() = 0;
};
class B : public virtual A {
virtual void M3() = 0;
};
class C : public virtual A {
virtual void M4() = 0;
};
class Aimpl : public virtual A {
void M1 () override {};
void M2 () override {};
};
class Bimpl: public virtual Aimpl, public virtual B {
void M3() override {};
};
class Cimpl: public virtual Aimpl, public virtual C {
void M4() override {};
};
请注意,我并不是非常熟悉虚拟继承,因此这可能是也可能不是应用虚拟继承的最佳方式。