を返す私は、コードを次ています共変仮想関数の型が問題
#include <iostream>
using namespace std;
class Child1
{
int i;
};
class Child2 : public Child1
{
int j;
};
class Base1
{
public:
virtual Child1& getChildren()
{
cout << "Children1" << endl;
return children;
}
private:
Child1 children;
};
class Base2 : public Base1
{
public:
virtual Child2& getChildren()
{
cout << "Children2" << endl;
return children;
}
private:
Child2 children;
};
このコードは罰金コンパイルが、私はどちらか、または両方Base1
とBase2
(例えばタイプのオブジェクトへの参照タイプからgetChildren()
の戻り値の型を変更したときにvirtual Child2 getChildren()
私は、参照を使用するときに、なぜ私はこのエラーを得ていないています知ってほしい
error C2555: 'Base2::getChildren': overriding virtual function return type differs and is not covariant from 'Base1::getChildren'
:、私は、Visual Studio 2010で次のエラーを取得しますそうでなければそれを得る。これはVS2010のバグですか? オーバーライド関数の戻り値の型は、オーバーライドされた関数の戻り値の型と同じか、関数のクラスとの共変量でなければなりません。C++標準(MicrosoftのWebサイトのthisページ)戻り値の型B :: fのクラスは、戻り値の型D :: fのクラスと同じクラスです。戻り値の型Dのクラスの明白な直接的または間接的な基底クラスです。 :fで、Dでアクセス可能です。
PS私は現時点で標準へのアクセス権を持っていないので、上の引用符を確認することはできません。
オブジェクトタイプに変更するとどうなりますか? –
@Daniel Hilgarth:はい。これらの2つのメソッド 'virtual Child1 getChildren()'と 'virtual Child2 getChildren()'で上記のコードをコンパイルすると、同じエラーが発生します。 –