猿问

为什么具有相同名称但签名不同的多重继承函数不会被视为重载函数?

为什么具有相同名称但签名不同的多重继承函数不会被视为重载函数?

下面的代码片段在编译过程中会产生一个“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;}


侃侃尔雅
浏览 415回答 3
3回答

潇湘沐

成员查找规则在第10.2 / 2节中定义以下步骤定义类范围中的名称查找结果C。首先,考虑类中及其每个基类子对象中的名称的每个声明。如果f一个子对象中B的成员名是基类子对象,则f该子对象中的成员名称隐藏成员名称。任何如此隐藏的声明都不予考虑。由using声明引入的每个声明都被认为来自于包含using声明指定的声明类型的每个子对象。AABC如果生成的声明集不是来自相同类型的子对象,或者集合具有非静态成员并且包括来自不同子对象的成员,则存在歧义并且程序格式错误。否则该集合是查找的结果。class&nbsp;A&nbsp;{public: &nbsp;&nbsp;int&nbsp;f(int);};class&nbsp;B&nbsp;{public: &nbsp;&nbsp;&nbsp;int&nbsp;f();};class&nbsp;C&nbsp;:&nbsp;public&nbsp;A,&nbsp;public&nbsp;B&nbsp;{};int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.f();&nbsp;//&nbsp;ambiguous}因此,您可以使用using声明A::f并B::f解决这种歧义class&nbsp;C&nbsp;:&nbsp;public&nbsp;A,&nbsp;public&nbsp;B&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;A::f; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;B::f;};int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;c; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.f();&nbsp;//&nbsp;fine}第二个代码完美无缺,因为void foo(float)它在C的范围内。实际上是d.foo(5);电话void foo(float)而不是int版本。
随时随地看视频慕课网APP
我要回答