我有一个比这更复杂的类结构,但把问题归结为它的本质,这描述了我的场景:我有两个类,A和B,实现共享一个共同祖先的纯虚拟基类,然后是第三个包含A和B的C类。最后,填充纯虚拟基础中常用方法的模板类:
struct I {
virtual void r()=0;
};
struct A : I {};
struct B : I {};
struct C : A, B {
void q(){
r(); // the problem is here.
}
};
struct D : C {
virtual void r(){
}
};
C* c = new D;
c->q();
我的问题是,我看不出任何方法让C :: q调用r()。
void C::q(){
r(); // is ambiguous
A::r(); // is pure virtual
B::r(); // also is pure virtual
D::r(); // C doesn't know about D
((D*)this)->r(); // is dubious and requires C to know about D.
}
如何从C调用r()方法以便调用正确的虚方法?
对不起,我应该澄清一下,这里不能使用虚拟继承。我找到了两个解决方案:
struct C : A, B {
virtual void r()=0;
...
要么
struct C : A, B {
using A::r;
...
两者似乎都足以消除对r()的调用的歧义以解决所有问题。