我有一个比这个更加复杂的类结构,但是将问题简化到其本质,可以描述我的情况:我有两个类A和B,它们实现了纯虚基类并共享一个共同祖先,然后第三个类C组合了A和B。最后,一个模板类填补了纯虚基类中的公共方法:
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();
我的问题是,我看不到任何调用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()的歧义,以便一切都能解决。
I
设为虚基类,你需要这样写:struct A : virtual I {};
和struct B : virtual I {};
。 - CB Baileyusing A::r;
并不能真正解决问题,至少标准规定这仍然是模棱两可的。 - Johannes Schaub - litb