gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:14:35 24 4
gpt4 key购买 nike

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

#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) 方法,因为派生类是从基派生的

最佳答案

根本原因是为了让代码更健壮。

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,并且您的派生类会安静地做一些事情与它之前所做的完全不同,也与它设计和记录的目的不同。

关于c++ - 隐藏基类中的所有重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com