为什么具有相同名称但签名不同的多重继承函数不会被视为重载函数?下面的代码片段在编译过程中会产生一个“foo的foo调用”错误,我想知道如果没有完全限定对foo的调用,是否有任何方法解决这个问题:#include <iostream>struct Base1{
void foo(int){
}};struct Base2{
void foo(float){
}};struct Derived : public Base1, public Base2{};int main(){
Derived d;
d.foo(5);
std::cin.get();
return 0;}所以,问题就像标题所说的那样。想法?我的意思是,以下工作完美无瑕:#include <iostream>struct Base{
void foo(int){
}};struct Derived : public Base{
void foo(float){
}};int main(){
Derived d;
d.foo(5);
std::cin.get();
return 0;}
3 回答
Cats萌萌
TA贡献1805条经验 获得超9个赞
成员查找规则在第10.2 / 2节中定义
以下步骤定义类范围中的名称查找结果
C
。首先,考虑类中及其每个基类子对象中的名称的每个声明。如果f
一个子对象中B
的成员名是基类子对象,则f
该子对象中的成员名称隐藏成员名称。任何如此隐藏的声明都不予考虑。由using声明引入的每个声明都被认为来自于包含using声明指定的声明类型的每个子对象。A
A
B
C
如果生成的声明集不是来自相同类型的子对象,或者集合具有非静态成员并且包括来自不同子对象的成员,则存在歧义并且程序格式错误。否则该集合是查找的结果。
class A {public: int f(int);};class B {public: int f();};class C : public A, public B {};int main(){ C c; c.f(); // ambiguous}
因此,您可以使用using
声明A::f
并B::f
解决这种歧义
class C : public A, public B { using A::f; using B::f;};int main(){ C c; c.f(); // fine}
第二个代码完美无缺,因为void foo(float)
它在C的范围内。实际上是d.foo(5);
电话void foo(float)
而不是int
版本。
- 3 回答
- 0 关注
- 441 浏览
添加回答
举报
0/150
提交
取消