加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:44:00 所属栏目:百科 来源:网络整理
导读:最近我开始知道这一点 – 如果派生类重新定义了基类成员方法,那么所有具有相同名称的基类方法都会隐藏在派生类中. #includeiostreamusing namespace std;class Base{public:int fun(){ cout"Base::fun() called";}int fun(int i){ cout"Base::fun(int i) cal
最近我开始知道这一点 – 如果派生类重新定义了基类成员方法,那么所有具有相同名称的基类方法都会隐藏在派生类中.

#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导致编译终止.

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

解决方法

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

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,并且您的派生类将悄悄地执行与之前完全不同的操作,并且与设计和记录的操作不同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读