2017-12-07 17 views
0

2番目の呼び出しで、以下のコードで基本クラスのメソッドが呼び出されるのはなぜですか?基本C++の代わりに導出関数が呼び出される

基本クラス:

class Number{ 

     public: 
     Number(){}  

     virtual print(){cout<<"Number"<<endl;} 
     virtual bool isEqual (Number* number){ cout<<"Base class"<<endl;} 
}; 

派生クラス:

class Int: public Number{ 
    int member; 
    public: 
     Int(int number){ member =number; } 

     int get Number(){ return member; } 
     print(){ cout<<"member"<<endl;} 
     bool isEqual(Int* number){ return member == number->getNumber(); } 
}; 

主な機能:ところで

int main(){ 
Int i1(3); 
Int i2(4); 

Number* nPtr = &i1; 

nPter->print(); /// prints 3 
nPter->isEqual(&i2); /// "Base class" 

... 

i1.isEqual(&i2); /// prints 0 -- works fine 
+1

これらの機能に「オーバーライド」を追加してください。あなたは驚くだろう。また、 'print'は戻り値の型がありません。擬似コードのためには少し擬似です。 – StoryTeller

+0

isEqualは、ベースクラスと派生クラスで異なるシグネチャを持ちます。あなたは関数をオーバーロードしました。基本クラスのポインタで呼び出すと、Number :: isEqualが呼び出され、Intポインタ/ refで呼び出されたときに呼び出されます。 Int :: isEqualを呼び出します。 – cppcoder

答えて

1

bool(Int*)bool(Number*)と同じタイプではないため、Int::isEqualの機能はではなく、の無効化Number::isEqualではなく完全に別個の機能です。

ちょっと考えてみてください。試行されたオーバーライドは意味をなさない:あなたの派生クラスは制約付きの引数を期待しているが、基底関数のパラメータの制約は少ない!あなたが望むものが許可されている場合、nPtr->isEqualと呼ばれ、派生クラスはサポートしていないポインタNumberポインターを呼び出すことができました。


正しい質問は共変戻り値の型が、反変パラメータのためになります。しかし、C++では、反復的なパラメータオーバーライドは許可されていません。

+0

したがって、コンパイルは名前と戻り値の型に従って関数をオーバーライドします。 –

+0

@AbdKhatib:いいえ。名前と*タイプ*に従って。 (特に、あなたの2つの関数は同じ* return *型を持っていますが、同じ*型*はありません) –

+0

引数の異なる関数は異なる関数と見なされますか? –

関連する問題