假设有这样一个接口:
class A{
public:
virtual foo()=0;
};
还有一个班B
它实现了这个接口:
class B:public A{
public:
virtual foo(){} //Foo implemented by B
}
终于有一节课了C
有课程A
and B
作为基类:
Class C : public A, public B {
};
我的问题是,有一种方法可以告诉编译器,foo
是课堂上的那个B
无需显式调用B::foo()
?
正如 @BenVoigt 在评论中指出的那样,下面的答案仅由于 g++ 中的错误而有效(这意味着它不能保证继续工作,而且绝对不可移植)。因此,尽管如果您使用特定的(有缺陷的)编译器,它可能会执行您想要的操作,但它不是您应该使用的选项。
Do use 虚拟继承 https://stackoverflow.com/q/21558/1214731尽管。
这并不完全是场景code问题中暗示着,但是句子
我的问题是,有一种方法可以告诉编译器
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;
}
当然,正如其他答案所指出的那样,问题中的代码本身根本不需要这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)