2017-01-02 7 views
-1

Ich versuche, ein dynamisches Array einer abstrakten Klasse (CellPhone) zu erstellen und dann mit verschiedenen Objekten des Typs Cell1 und Cell2 zu füllen.Erstellen eines dynamischen Arrays einer abstrakten Klasse

Ich habe versucht, mit dynamischen Arrays und Vektoren aber beide geben einen Fehler:

Alle Klassen erstellt werden und arbeiten, aber in der Haupt:

Cell1 c1("Orange", "Hello! This is your friend Rima, call me when you can.", 0777170, "Sony"); 
Cell2 c2("Zain", "Call me ASAP, Sam", 0777777777, "blue", "wifi"); 
Cell1 c3("Omnia", "Let me know when you can pass by", 0711111111, "Samsung"); 

CellPhone *c[3]; 

*c[0]=&c1;  //Conversion to base class error 


vector<CellPhone*> cp; 
cp.push_back(&c1);  //Conversion to base class error 

Ich habe andere Fälle sah aber in beiden Richtungen Ich erhalte einen Fehler? Warum? Und wie man es repariert?

EDIT: Hier sind die Klassenüberschriften als Referenz:

class CellPhone{ 
    private: 
    string branch, message; 
    int phoneNumber; 
public: 
    CellPhone(string, string, int); 
    virtual void receiveCall() = 0; 
    void receiveMessage(); 
    virtual void dial() = 0; 
    void setBranch(string); 
    void setMessage(string); 
    void setPhoneNumber(int); 
    string getBranch(); 
    string getMessage(); 
    int getPhoneNumber(); 

};

#include "CellPhone.h" 

class Cell1:CellPhone{ 
private: 
    string cameraType; 
    bool isCameraUsed; 
public: 
    Cell1(string, string, int, string); 
    void capture(); 
    void receiveCall(); 
    void dial(); 
    void setCameraType(string); 
    string getCameraType(); 

};

#include "Cell1.h" 

class Cell2:CellPhone{ 
private: 
     string wifi, bluetooth; 
public: 
    Cell2(string, string, int, string, string); 
void turnBluetoothOn(); 
void turnBlueToothOff(); 
void setWifi(string); 
void setBluetooth(string); 
string getWifi(); 
string getBluetooth(); 
void receiveCall(); 
void dial(); 

};

Zelle2 hat die Referenz von Zelle1, denn wenn dies nicht der Fall wäre, würde es im Wesentlichen einen Klassenredefinitionsfehler geben.

+0

Ohne CellPhone, Cell1, Cell2 Definition ist es unmöglich zu beantworten. http://stackoverflow.com/help/mcve – jpo38

+0

Fertig in der Bearbeitung –

+0

Wenn Sie keine Vererbung auswählen, verwendet C++ standardmäßig private Vererbung. Das ist nicht klug. – IInspectable

Antwort

2

Ersetzen Sie einfach die Klasse Cell2 : CellPhone durch class Cell2 : public CellPhone.

Andernfalls ist die Konvertierung von Cell2 zu CellPhone nicht möglich (Vererbung ist private, wenn nicht angegeben).

Edit: Wie unten angegeben, wird dringend empfohlen, dass Sie einen virtuellen Destruktor für CellPhone Klasse deklarieren (das ist für jede Klasse empfohlen, die Sie irgendwann spezialisieren).

+0

Außerdem ist es zu 99% wahrscheinlich, dass Sie CellPhone einen virtuellen Destruktor hinzufügen sollten. – Frank

+0

@Frank: Es ist 100% wahrscheinlich, wenn Sie abgeleitete Objekte in einem Array zu Basisklassenzeigern speichern. Welches ist das OP? – IInspectable

+0

Das ist nur wahr, wenn er die Objekte aus diesem Vektor löscht, was nicht der Fall ist, da er die Zellenobjekte auf dem Stapel erstellt. Es gibt einige seltene Randfälle, bei denen ein virtueller Destruktor nicht erwünscht ist (und im Allgemeinen einen geschützten Destruktor zur Vermeidung von Problemen beinhaltet), aber dies ist hier mit ziemlicher Sicherheit nicht der Fall. – Frank

Verwandte Themen