正如@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;
}
当然,正如其他答案所指出的那样,问题中的代码本身根本不需要这样做。