2017-10-16 7 views
-1

私は継承でこの問題を抱えています。私には3つのクラスがあり、それらの間に親の関係があります。それらのすべてには、関数とcalcForces()があります。継承:子は自身の代わりに親仮想関数を使用します

class Object { 
public: 
    virtual void calcForces(); 
}; 


class Boat : public Object { 
public: 
    virtual void calcForces(); 
}; 


class Sailboat : public Boat { 
public: 
    void calcForces(Wind wind); 
}; 

今私の問題は、IIがヨット(およびオブジェクトのポインタでそれを保存した)として作成されたオブジェクトを持っていますが、私はcalcForces()を呼び出したとき、私はボートの内側に終わるということです:: calcForces()、ないSailboat :: calcForces()。私は間違って何をしていますか?ここで

は、関数への私の呼び出しです:オーバーライドの

(*this->object_ptr_arr[i]).calcForces(); //'object_ptr_arr' is of type 'Object**' 
+2

[MCVE]を表示してください。 –

+2

多型の動作のためにポインタを呼び出す必要があります。 'this-> object_ptr_arr [i] - > calcForces();' – Galik

+4

このような問題を避けるには、http://ja.cppreference.com/w/cpp/language/override – stefaanv

答えて

11

宣言が一致している必要があります。 Sailboat::calcForcesの宣言では、別のパラメータ(Windインスタンス)が使用されるため、オーバーライドではありません。

@stefaanvと@skypjackによってコメントされたように、コンパイル時にエラーを検出したoverride関数指定子の使用を取り入れることで、この問題を回避できます。

+0

をご覧ください。 – fjardon

+0

コンパイル時に一致をチェックする目的に役立つ 'override'キーワードについて言及し、エラーを回避します。 – skypjack

+0

@skypjack完了! – acraig5075

2

あなたのヨットにcalcForces()メソッドを追加する必要がある場合は、追加してください。あなただけのヨットでcalcForces(Wind wind)方法(およびBoatから継承されcalcForces())を持っている時点では

だから、あなたはそれが継承されたメソッドになってしまいますパラメータなしcalcForcesを呼び出しているとき。これを修正するには、上記のようにSailboatに追加するか、タイプ変数Wind

2

としてください。提案 - ボートとヨットが環境内に存在します。ボートは環境にどのような影響を受けるかを知っています。

class Environment 
{ 
public: 
    Wind wind; 
}; 

class Object { 
public: 
    virtual void calcForces(Environment const&); 
}; 


class Boat : public Object { 
public: 
    virtual void calcForces(Environment const& env); // can ignore the wind 
}; 


class Sailboat : public Boat { 
public: 
    void calcForces(Environment const& env) override; // will use env.wind in calculation 
}; 

環境を変更して、環境内のすべてのオブジェクトに力を計算させることができます。ボート、ヨット、イルカなど。

+0

オブジェクト指向のアプローチのおかげで、非常に良い提案となりました。しかし、それは彼が間違っていたことを記述していないので、彼が将来類似の問題に直面しているなら、あまり役に立ちません。 – Rafiwui