2016-04-03 11 views
-1

ich diese Basisklasse habenC++ - Erstellen von nicht-abstrakte Objekte aus abstrakten Objekten

class Object { 
... 
public: 
    virtual void move() = 0; 
    virtual void move(string) = 0; 
    virtual void powerOn() = 0; 
    virtual void powerOff() = 0; 
    virtual void speak() = 0; 
}; 

Dies wird die Basisklasse für verschiedene Klassen

class Electronics : public Object { 
... 
public: 
    virtual void powerOn(); 
    virtual void powerOff(); 
}; 

void Electronics::powerOn() { ... } 
void Electronics::powerOff() { ... } 

class Phone : public Electronics { 
... 
public: 
}; 

Nun, wenn ich erstellen möchten ein Objekt Phone, das die Methoden powerOn() und powerOff() verwendet. Ich brauche die anderen drei Methoden nicht.

Object *obj = new Phone; 

Aber das würde mir wahrscheinlich einen Fehler ausgeben

undefined reference to move() 
undefined reference to move(string) 
undefined reference to speak() 

Meine Frage ist, zu sagen, wie kann ich diesen Fehler zu vermeiden. Ich brauche diese Funktionen nicht für Phone, aber ich muss etwas mit ihnen machen. Wie kann ich diesen Fehler beheben?

Dank

+0

Sie können diese Funktionen aus dem Objekt entfernen und sie in niedrigeren Unterklassen verwenden, wo Sie sie wirklich brauchen – Pooya

+0

Ich muss später etwas tun wie: Objekt * Telefon = neues Telefon. Und später, wenn ich phone-> powerOn() anrufe, wird es sagen, dass es keine powerOn() -Methode in der Klasse gibt. –

Antwort

0

Sie leer Umsetzung dieser virtuellen Methoden in entweder Electronics oder Object zur Verfügung stellen können (die Methoden nicht abstrakt machen). Oder wenn beides so sein muss, müssen Sie sie in Phone neu implementieren. Sie können sie jedoch nicht in Phone "verstecken", es sei denn, Sie entfernen sie von ihren Basis (n).

+0

Es tut mir leid, aber was meinst du mit "leere Implementierung" –

+0

@thisisalongdisplayname Wie TommyA erwähnt, leer Implementierung ist eine Funktion/Methode mit leerem Körper, z foo() {} – Resurrection

0

Wie bereits erwähnt, können Sie eine leere Implementierungen von ihnen in der Electronics Klasse erstellen, mit anderen Worten überschreiben Sie die Methode in dieser Klasse, und lassen Sie es einfach einen leeren Körper haben. (Siehe Beispiel hier: http://ideone.com/jM2hX7)

#include <iostream> 
using namespace std; 

class Object { 
public: 
    virtual void move() = 0; 
    virtual void move(string) = 0; 
    virtual void powerOn() = 0; 
    virtual void powerOff() = 0; 
    virtual void speak() = 0; 
}; 

class Electronics : public Object { 
public: 
    virtual void move() override {} 
    virtual void move(string) override {} 
    virtual void powerOn() override {cout << "powerOn" << endl;} 
    virtual void powerOff() override {cout << "powerOff" << endl;} 
    virtual void speak() override {} 
}; 

class Phone : public Electronics { 
    virtual void powerOn() override {cout << "phone:powerOn" << endl;} 
    virtual void powerOff() override {cout << "phone:powerOff" << endl;} 
}; 

int main() { 
    Object* phone = new Phone; 

    phone->move(); 
    phone->powerOn(); 
    phone->powerOff(); 
    phone->speak();  

    delete phone; 
    return 0; 
} 

Ausgänge:

phone:powerOn 
phone:powerOff 

Noch wichtiger ist, obwohl Sie Ihre Klasse-Design zu überdenken möchten, ist es wirklich notwendig, rein virtuelle Methoden zu haben wie powerOn, powerOff, speak, ... in Ihrer Klasse: Object. Das Objekt klingt wirklich allgemein und diese Funktionen klingen spezifischer. Object sollte idealerweise nur aus Funktionen bestehen, die für alle davon erben Klassen sinnvoll sind.

Diese Funktionen könnten in der Klasse Electronics mehr Sinn ergeben, auch wenn das sogar etwas zu allgemein erscheint.

Wenn es wirklich erforderlich ist, diese Objekte in der Object Klasse zu haben, dann würde ich es persönlich zu etwas mehr sagen.

+0

Ja, aber wenn ich: Objekt * phone = neues Telefon, und zu einem späteren Zeitpunkt Anruf Telefon> powerOn(), wird sagen, dass Objekt-Klasse hat keine Methode namens powerOn() –

+0

@ thisisalongdisplayname warum Würde es sagen, dass, wenn Sie die 'powerOn'-Methode implementiert haben, wie Sie in der' Electronics' Klasse haben? –

+0

Da Phone ein Objekttyp ist, wird beim Aufruf von pwerOn() in der Object-Klasse nach powerOn() gesucht. Ist das nicht richtig? –