2010-10-03 11 views
6

Ich habe diese beiden KlassenCopykonstruktor von Base und abgeleiteten Klassen

///////////BASE CLASS 

    class Base{ 
    public: 
    Base(int = 0); 
    ~Base(); 
    Base(Base&); 
    Base(Derived&); ////<-may be problem here?, note: I tried without this function 
    int valueOfBase(); 
    protected: 
    int protectedData; 
    private: 
    int baseData; 
    }; 

    /////////////DERIVED CLASS 
    class Derived: public Base{ 
    public: 
    Derived(int); 
    //Derived(Derived&); 
    ~Derived(); 
    private: 
    int derivedData; 
    }; 

and here my main 

    int main(){ 
    Base base(1); 
    Derived derived = base; 
    return 0; 
    } 

ich gelesen, dass, wenn meine abgeleiteten Klasse copy c'tor of the base will be called nicht Kopie c'tor haben, aber jedes Mal, wenn ich erhalten conversion from Base to non-scalar type Derived requested, die falsch ist? mein Compiler oder mein Buch, oder habe ich gerade missverstanden? danke im voraus

+5

Sie haben wahrscheinlich falsch gelesen (der vom Compiler generierte Kopierkonstruktor für Derived * auch * kopiert den Basisteil des Objekts mit dem Kopierkonstruktor von Base). - Die Verwendung des Kopierkonstruktors des Elternteils * an dieser Stelle * ergibt keinen Sinn: das würde * bedeuten, dass * Objekte standardmäßig beim Kopieren in Scheiben geschnitten werden. – UncleBens

Antwort

3

Nur ein Hinweis.

Gibt der folgende Code den gleichen Fehler?

class base{}; 
class derived: public base{}; 

int main() 
{ 
     derived d= base(); 
} 

Ja? Warum? Weil es keine Konvertierung von der Basisklasse in die abgeleitete Klasse gibt. Sie sollten diese Konvertierung definieren, wenn Sie Ihren Code kompilieren möchten.

Wie wäre es, dies der abgeleiteten Klasse hinzuzufügen?

derived(const base &b){} 

Macht Sinn, nicht wahr?

+0

danke für deine antwort, aber ich weiß es, am ende schrieb ich meine frage, ich habe in meinem buch diese regel gelesen, ich habe es implementiert, aber es scheint nicht zu funktionieren, ist es möglich, ohne abgeleitete (const base & b) {}? – rookie

+3

Lesen Sie den @UncleBens Kommentar zu Ihrer Frage. –

Verwandte Themen