最近我开始知道这一点 - 如果派生类重新定义了基类成员方法,那么所有具有相同名称的基类方法都会隐藏在派生类中。
#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行:错误:没有匹配函数来调用'Derived :: fun(int)' 由于-Wfatal-errors而导致编译终止。
但只是想知道其背后的原因?为什么它不调用基类的fun(int i)方法,因为Derived类是从Base
派生的答案 0 :(得分: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
,而您的派生类会悄悄地执行与之前完全不同的操作,并且与设计和记录的内容不同做。
答案 1 :(得分:2)
您已经发现派生类重载将使用相同的名称但不同的参数来影响(阻止可见性)基类方法。我们只是声称这是出于某些历史或感知的安全原因而做的,并且看一下修复:
class Derived: public Base
{
public:
using Base::fun; // expose the base-class method
int fun()
{
cout<<"Derived::fun() called";
}
};