2016-07-13 13 views
1

Gegeben 3 Klassen.C++ Polymorphismus und spezifische Methoden

Angenommen, wir empfangen einen Parameter per Befehlszeile, der uns verstehen lässt, ob wir ein Flugzeug oder ein Boot verwalten.

Beachten Sie, dass verschiedene Methoden für Boot und Flugzeug vor dem Start aufgerufen werden. (Start ist die einzige allgemeine Methode) Dieser Code wird nicht funktionieren, da v die Methoden setRoute/SetALtitude nicht enthält.

Wie kann dieses Muster richtig implementiert werden?

+0

Sorry, schreibt 'if (Parameter == 1)' statt 'if (Parameter = 1)' ... – ilotXXI

+2

In diesem Fall ich versuche sein würde Höhen Teil des 'route' zu ​​machen. Ansonsten, wenn sie unterschiedliche Fähigkeiten haben, können Sie ihnen verschiedene Schnittstellen wie 'class flyable' und' class sailable' geben, so dass eine Ebene "Klasse Flugzeug: öffentliches Fahrzeug, öffentlich fliegbar {}' und ein Boot 'Klassenboot: öffentliches Fahrzeug sein kann. public sailable {} '... – Galik

+0

aber unterschiedliche Schnittstellen erlauben es mir nicht, Polymorphie zu verwenden, oder? – Franconet

Antwort

3

können Sie ganz einfach tun:

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

und ähnliche für airplane.

+0

Was ist, wenn ich dieses Szenario habe? 'if (Parameter! = 1) { Boot * b = neues Boot; b-> setRoute (r); v = b; } v.start(); /* Jetzt brauche ich etwas zu setzen sonst */ wenn { Boote * c = new Boot (Parameter = 1!); b-> SetSomethingElse (r); v = b; // Routenzuordnung ist verloren! } ' – Franconet

+0

@Franconet' Boot * b = (Boot *) v; '? (Oder 'boot * b = static_cast (v);' wenn Sie diesen Stil bevorzugen) – 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

Ist '__declspec (novtable)' tragbar oder spezifisch für MSCV? – Garf365

+0

spezifisch für MSCV, aber benutze es optional – RbMm

+3

Ich mag nicht setAltitude() auf Boot ... – Franconet