实现具有多重继承的纯虚函数

Dan*_*aad 5 c++ inheritance multiple-inheritance pure-virtual

假设有这个界面:

class A{  
 public:  
  virtual foo()=0;  
};
Run Code Online (Sandbox Code Playgroud)

以及B实现此接口的类:

class B:public A{    
 public:   
  virtual foo(){} //Foo implemented by B   
}
Run Code Online (Sandbox Code Playgroud)

最后,一个C具有类AB基类的类:

Class C : public A, public B {
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,有一种方法可以告诉编译器,实现foo是来自类的实现B而不进行显式调用B::foo()

tmp*_*rce 3

正如 @BenVoigt 在评论中指出的那样,下面的答案仅由于 g++ 中的错误而有效(这意味着它不能保证继续工作,而且绝对不可移植)。因此,尽管如果您使用特定的(有缺陷的)编译器,它可能会执行您想要的操作,但它不是您应该使用的选项。

但一定要使用虚拟继承


这并不完全是问题中的代码所暗示的场景,而是句子

我的问题是,有一种方法可以告诉编译器 foo 的实现是来自类 B 的实现,而无需显式调用 B::foo() 吗?

似乎要求语法来区分函数的多个基本版本而不使用限定符::

您可以使用using指令来执行此操作:

#include <iostream>
class A {
public:
A(){}
virtual void foo(){std::cout<<"A func";}
};

class B: virtual public A {
  public:
  B(){}
  virtual void foo(){std::cout<<"B func";}
};
class C:virtual public A, virtual public B {
    public:
    C(){}
    using A::foo; // tells the compiler which version to use
                   // could also say using B::foo, though this is unnecessary
};

int main() {
    C c;
    c.foo(); // prints "A func"
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,正如其他答案所指出的那样,问题中的代码本身根本不需要这样做。