gpt4 book ai didi

C++ 继承和名称隐藏

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:13 25 4
gpt4 key购买 nike

<分区>

我知道这不是关于这个主题的第一个问题,但据我所知,我阅读的所有其他相关问题(和答案)都略微离题。拿代码

#include <iostream>

using namespace std ;

class Base {
public:
void methodA() { cout << "Base.methodA()" << endl ;}
};

class Derived : public Base {
public:
void methodA(int i) { cout << "Derived.methodA(int i)" << endl ;}
};

int main()
{
Derived obj;
obj.methodA();
}

使用最新版本的 g++ 编译此代码会出现错误

no matching function for call to 'Derived::methodA()'

正是因为这个错误,我来到 Stackoverflow 上寻找答案。但没有一个答案能让我信服。这两个方法的签名在区分它们时没有歧义,编译器应该能够在基类中选择该方法。注释掉就可以了

class Derived : public Base {
//public:
// void methodA(int i) { cout << "Derived.methodA(int i)" << endl ;}
};

并且代码按预期工作。这意味着在基类中隐藏同名成员函数只是成员函数名称,并且不考虑签名,就像函数名称没有被破坏一样(在这种情况下,破坏应该解决任何歧义)。 其他人在类似的问题中写道,这违背了 C++(以及我补充的面向对象)的精神,我完全同意他的看法。这是函数重载的限制,我真的没有看到任何合理的理由。

显然问题已经关闭,所以我无法在阅读答案后添加回复,只能编辑我自己的初始问题。我相当确定(但我无法证明这一点)在较旧的 C++ 编译器中,我最初问题中的代码可以毫无问题地编译(然后执行)。我的观点是,我真的看不到该语言设计(如答复中所称)背后的基本原理。在这种情况下,编译器具有可用的所有信息以便采取适当的操作,这正是我所期望的。否则看起来,通过语言设计选择,已选择不考虑成员函数的签名,这听起来很奇怪。我在上面提到的“programmerinterview”阅读了这篇文章,但它没有解释语言设计选择的动机(此外,该文章末尾示例代码中“GrandChildClass”中的“someFunction”不会覆盖,如前所述,同名上升类成员函数:两个同名成员函数具有不同的签名 - 因此它不是重写)。

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