2016-07-13 3 views
1

与えられた3つのクラス。C++多型と特定のメソッド

class vehicle{ 
public: 
void start(); 
} 

class airplane: public vehicle{ 
void start(); 
void setRoute(route r); 
void setAltitude(altitude a); 
} 

class boat: public vehicle{ 
void start(); 
void setRoute(route r); 
} 

は、我々は飛行機や船を管理する場合は、私たちは理解してみましょう、コマンドラインでパラメータを受け取ったと仮定します。

Vehicle* v; 


if (parameter == 1) { 
    v = new airplane(); 
    v->setRoute(r); 
    v->setALtitude(a); 
} 

if (parameter != 1) { 
    v = new boat(); 
    v->setRoute(r); 
} 


v->start(); 

開始前にボートと飛行機に異なるメソッドが呼び出されることに注意してください。 (Startは唯一の一般的な方法です) vにはsetRoute/SetALtitudeメソッドが含まれていないため、このコードは機能しません。

このパターンを実装する正しい方法は何ですか?

+0

申し訳ありませんが、 ''書く場合代わりに(パラメータ== 1) '場合(パラメータ= 1) '...私は' route'の高度の部分を作るために誘惑されることになる。この例では – ilotXXI

+2

。それ以外の能力を持っていれば、 'class flyable'や' class sailable'のような別個のインターフェースを与えることができるので、プレーンは 'class airplane:public vehicle、public flyable {}'と 'class boat:public vehicle、 public sailable {} '... – Galik

+0

しかし、別個のインターフェースで多型を使用することはできません。 – Franconet

答えて

3

あなたは簡単に行うことができますairplaneため

if(parameter != 1) 
{ 
    boat *b = new boat; 
    b->setRoute(r); 
    v = b; 
} 

と類似しました。

+0

このシナリオがあればどうなりますか? 'if(パラメータ!= 1) { ボート* b =新しいボート; b-> setRoute(r); v = b; } v.start(); /*今私は(!パラメータ= 1) { ボート*のC =新しいボートならば、何か他のもの*/ を設定する必要があります。 b-> SetSomethingElse(r); v = b; //ルートの割り当てが失われました! } ' – Franconet

+0

@Franconet' boat * b =(ボート*)v; '? (キャストのスタイルが好きな人は 'boat * b = static_cast (v);') – immibis

0
class __declspec(novtable) vehicle{ 
public: 
    virtual void start(); 
    virtual void setRoute(route r) = 0; 
    virtual void setAltitude(altitude a) = 0; 
}; 

class airplane: public vehicle{ 
    virtual void start(); 
    virtual void setRoute(route r); 
    virtual void setAltitude(altitude a); 
}; 

class boat: public vehicle{ 
    virtual void start(); 
    virtual void setRoute(route r); 
    virtual void setAltitude(altitude a); 
}; 
+1

'__declspec(novtable)'はMSCVに移植可能であるか特定ですか? – Garf365

+0

MSCVに固有ですが、オプションで使用しています – RbMm

+3

ボートでsetAltitude()を使用したくない... – Franconet