首页 文章

隐藏基类中的所有重载方法

提问于
浏览
3

最近我开始知道这一点 - 如果派生类重新定义了基类成员方法,那么所有具有相同名称的基类方法都会隐藏在派生类中 .

#include<iostream>

using namespace std;

class Base
{
public:
int fun()
{
    cout<<"Base::fun() called";
}
int fun(int i)
{
    cout<<"Base::fun(int i) called";
}
};

class Derived: public Base
{
public:
int fun() 
{
    cout<<"Derived::fun() called";
}
};

int main()
{
Derived d;
d.fun(5);  // Compiler Error
return 0;
}

错误:在函数'int main()'中:第30行:错误:由于-Wfatal-errors,没有匹配函数调用'Derived :: fun(int)'编译终止 .

但只是想知道它背后的原因?为什么它不调用Base类的fun(int i)方法,因为Derived类是从Base派生的

2 回答

  • 5

    根本原因是使代码更加健壮 .

    struct Base {
    };
    
    struct Derived : Base {
        void f(long);
        void g() { f(3); } // calls Derived::f
    }
    

    现在假设 Base 在库中定义,并且您获得该库的更新,并且更新更改了 Base 的定义:

    struct Base {
        void f(int);
    };
    

    现在假设在找到名称时搜索重载函数没有停止 . 在这种情况下, Derived::g 将调用 Base::f 而不是 Derived::f ,并且您的派生类将悄悄地执行与之前完全不同的操作,并且与设计和记录的操作不同 .

  • 2

    您已经发现派生类重载将使用相同的名称但不同的参数来影响(阻止基类方法的可见性) . 我们只是声称这是出于某些历史或感知的安全原因而做的,并看一下修复:

    class Derived: public Base
    {
    public:
      using Base::fun; // expose the base-class method
      int fun() 
      {
        cout<<"Derived::fun() called";
      }
    };
    

相关问题