抽象基类的模糊继承:

Chr*_*cke 11 c++

我有一个比这更复杂的类结构,但把问题归结为它的本质,这描述了我的场景:我有两个类,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();
Run Code Online (Sandbox Code Playgroud)

我的问题是,我看不出任何方法让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.
}
Run Code Online (Sandbox Code Playgroud)

如何从C调用r()方法以便调用正确的虚方法?


对不起,我应该澄清一下,这里不能使用虚拟继承.我找到了两个解决方案:

struct C : A, B {
  virtual void r()=0;
  ...
Run Code Online (Sandbox Code Playgroud)

要么

struct C : A, B {
   using A::r;
   ...
Run Code Online (Sandbox Code Playgroud)

两者似乎都足以消除对r()的调用的歧义.

Căt*_*tiș 4

在 C 中将方法 r 重新声明为纯虚函数:

struct C : A, B {
  void q(){
    r();              // the problem is here.
  }

  virtual void r()=0;
};
Run Code Online (Sandbox Code Playgroud)