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具有类A和B基类的类:
Class C : public A, public B {
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,有一种方法可以告诉编译器,实现foo是来自类的实现B而不进行显式调用B::foo()?
正如 @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)
当然,正如其他答案所指出的那样,问题中的代码本身根本不需要这样做。