考虑一下代码:
#include <stdio.h>
class Base {
public:
virtual void gogo(int a){
printf(" Base :: gogo (int) \n");
};
virtual void gogo(int* a){
printf(" Base :: gogo (int*) \n");
};
};
class Derived : public Base{
public:
virtual void gogo(int* a){
printf(" Derived :: gogo (int*) \n");
};
};
int main(){
Derived obj;
obj.gogo(7);
}
Run Code Online (Sandbox Code Playgroud)
得到此错误:
>g++ -pedantic -Os test.cpp -o test test.cpp: In function `int main()': test.cpp:31: error: no matching function for call to `Derived::gogo(int)' test.cpp:21: note: candidates are: virtual …
据我所知,我知道这不是关于这个问题的第一个问题,但我读到的所有其他相关问题(和答案)都略显不合适.拿代码
#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();
}
Run Code Online (Sandbox Code Playgroud)
使用最新版本的g ++编译此代码会产生错误
no matching function for call to 'Derived::methodA()'
Run Code Online (Sandbox Code Playgroud)
正是因为这个错误,我才想到Stackoverflow找到答案.但是没有一个答案对我有说服力.这两种方法的签名在区分它们时没有任何歧义,编译器应该能够在基类中获取方法.只是评论出来
class Derived : public Base {
//public:
// void methodA(int i) { cout << "Derived.methodA(int i)" << endl ;}
};
Run Code Online (Sandbox Code Playgroud)
并且代码按预期工作.这意味着它只是成员函数名称在基类中隐藏相同的名称成员函数,并且不考虑签名,例如函数名称没有被修改(在这种情况下,修改应该解决任何歧义).其他一些人在一个类似的问题中写道,这违背了C++的精神(以及我添加的面向对象),我完全赞同他.这是函数重载的限制,我真的看不出任何合理的原因.
显然问题已经关闭,所以除了编辑我自己的初始问题之外,我无法在阅读答案后添加回复.我相当肯定(但我不能证明它)在旧的C++编译器中,我的初始问题中的代码将编译(然后执行)没有问题.我的观点是,我真的没有看到语言设计背后的理由(正如在回复中所说的那样).在这种情况下,编译器可以获取所有信息以便采取适当的操作,这就是我所期望的.否则看起来,通过语言设计选择,它被选择不考虑成员函数的签名,这听起来很奇怪.我在上面指出的"programmerinterview"中读到了这篇文章,