エラーや警告なしでコンパイルされた次のコードがあります。
#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()'
2 つの関数が戻り値の型だけが異なる場合、オーバーロードではなくオーバーライドが行われるため、両方の結果が期待どおりです。しかし、最初のプログラムのように関数を宣言すると、エラーが発生し、その理由を理解できません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()'
foo()
functionをvirtual
classとして宣言する以外は何も変更していませんFather
。すると、最初のプログラムにはなかった衝突が突然発生します。私はこれを理解することができません。
助言がありますか?ありがとうございました。