2012-04-08 8 views
0

Possible Duplicate:
c++ virtual function return type異なる戻り値

私はここで、シンプルだが紛らわしい質問があります。オーバーライドされたメソッドの戻り値の型が、基本クラスで定義されているabstactの戻り値の型と異なるのは合法ですか?私はそれをし、コンパイラは不平を言わなかった...誰か説明してもらえますか?

class MyBaseClass 
{ 
    int value; 

public: 
    virtual int getValue() = 0; 
}; 

class MyClass : public MyBaseClass 
{ 
    double value; 

public: 
    virtual double getValue(); // here!!! return is double, not int 
}; 

double MyClass::getValue() 
{ 
    return this->value; 
} 

全く似たような(MSVCウントのMinGWを)受け入れコンパイラ...誰もが、これは合法であるどの程度にexaplainしてくださいだろうか?

+0

サブクラスでdoubleを使用している場合、基本クラスにint値があるのはなぜですか? – dexametason

+2

GCC 4.6.1がエラーになりました:エラー: 'virtual double MyClass :: getValue()'に指定されている競合する戻り値のタイプ – enobayram

+0

実際に私のプログラムではintとdoubleではありません。これは2倍で、3つのコンポーネントを持つMathVectorです。基本クラスはスカラ信号を生成し、派生クラスは3D信号を生成します。 –

答えて

2

戻り値の型は異なりますが、制約が厳しく、コードは違法です。オーバーライドの戻り値の型が異なることが許される唯一の方法は、ベースの戻り値の型がポインタまたは参照である場合、それが共変する可能性があることです。別の言い方をすれば、ベースがポインタまたはベースクラスへの参照を返す場合、オーバールードはそれぞれ、ベースの派生クラスにポインタまたは参照を返すことができます。

+0

私のコードがコンパイルされるとどう説明しますか?この方法は純粋です!オーバーライドされずに新しいメソッドとして定義されている場合、コンパイラは純粋なメソッドが使用されていないことについて文句を言う必要があります。私は本当に混乱している! –

+0

あなたが投稿したコードはコンパイルされません – juanchopanza

+0

私のコードでは、私は基本クラスでdoubleを持ち、MathVector <3,double>(派生クラスでは3は3次元です)、MathVector <3,double>のコンストラクタはdoubleを引数として受け取ります。プログラムが自動的に暗黙的な変換を行ってそれを動作させることができますか? –

0

オーバーライドしていますか?あなたは方法を書いたように見えます。

関連する問題