class A {};
class B : A {};
class C {
virtual B *f() { returnNULL; }
};
class D : C {
virtual A *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C;
class A {
virtual A *f() { returnNULL; }
};
class B : A {
virtual C *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C : B {
virtual C *f() { returnNULL; } //нормально
};
class C;
class A {
virtual A *f() { returnNULL; }
};
class B : A {
virtual C *f() { returnNULL; } //Error: overriding virtual function with different return type
};
class C : A {};
class C;
class A {
virtual A *f() { returnNULL; }
};
class C : A {};
class B : A {
virtual C *f() { returnNULL; } //нормально
};
テンプレートクラス内のテンプレートメソッドが何らかの理由でコンパイラに見つからず、エラーになった場合、今、誰がその問題を解決しているのでしょうか?
no one of overloads can be applied to the function call
?
Cコンパイラは、このような場合、どのような型を代入したのか、どのようなプロトタイプの関数が見つからないのかを具体的に書いてくれるので、何が問題なのかが大体わかるのだが、ここでは具体的なことは書いてくれない。
直接的に継承しても問題がないため、あえてこのようにしました。
正確なルールを知りたいのですが、仮想関数を 異なる型の戻り値でオーバーライドする権利は、どのような場合にあるのでしょうか?
それともオーバーロード?
正確なルールを知りたいのですが、仮想関数を 異なる型の戻り値でオーバーライドする権利はいつあるのでしょうか?
ありがとうございます。すべてに意味がある。
...オーバーライドされた関数の戻り値の型が継承される場合 ...を、オーバーライドされたものが返す型から削除します。
逆の場合はどうでしょう?
逆の場合はどうでしょう?
この例では、CからDへの継承が行われていません。
はい、私のミスです、すみません。
また、物議を醸した例です。
また、物議を醸した例です。
実行ファイルが生成されないため)エラーは発生しますが、関数B::fはA::fをオーバーライドするため、C::fのオーバーライドエラーは発生しないことになります。
よくわからないけど、ほぼ同じような感じ
一方にエラーがあり、もう一方にエラーがない。そして、ラインを入れ替えただけ