我有以下代码编译时没有任何错误或警告。
#include<iostream>
using namespace std;
class Father
{
public:
int foo()
{
cout<<"int foo";
return 111;
}
};
class Son: public Father
{
public:
long foo()
{
cout<<"long foo";
return 222;
}
};
int main()
{
Son x;
long n;
n=x.foo();
cout<<"\nn is "<<n;
return 0;
}
输出如下所示。
long foo
n is 222
我想该函数foo()
在派生类中被覆盖Son
并且没有重载,因为下面的程序给了我错误。
using namespace std;
class Father
{
public:
int foo()
{
cout<<"int foo";
return 111;
}
long foo()
{
cout<<"long foo";
return 222;
}
};
int main()
{
Father x;
long n;
n=x.foo();
cout<<"\nn is "<<n;
}
错误消息如下所示。
error: 'long int Father::foo()' cannot be overloaded
error: with 'int Father::foo()'
这两种结果都符合预期,因为当两个函数仅在返回类型上有所不同时,就会发生覆盖而不是重载。但是当我在第一个程序中声明该函数时foo()
,virtual
我遇到了错误,我无法理解原因。我违反了什么规则?程序如下图,
#include<iostream>
using namespace std;
class Father
{
public:
virtual int foo()
{
cout<<"int foo";
return 111;
}
};
class Son: public Father
{
public:
long foo()
{
cout<<"long foo";
return 222;
}
};
int main()
{
Son x;
long n;
n=x.foo();
cout<<"\nn is "<<n;
}
错误信息如下所示,
error: conflicting return type specified for 'virtual long int Son::foo()'
error: overriding 'virtual int Father::foo()'
除了在 class 中声明 function 之外foo()
,我没有做任何更改。然后突然出现了第一个程序中没有的冲突。我无法理解这一点。virtual
Father
有什么建议么?谢谢你。