2010-10-03 5 views
6

J'ai ces deux classesconstructeur de copie de base et les classes dérivées

///////////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; 
    } 

je lis que si ma classe dérivée ne pas copier c'tor copy c'tor of the base will be called mais chaque fois que je reçois conversion from Base to non-scalar type Derived requested qui a tort? mon compilateur ou mon livre, ou j'ai juste mal compris? merci d'avance

+5

Vous avez probablement mal lu (le constructeur de copie généré par compilateur pour Derived * aussi * copie la partie Base de l'objet, en utilisant le constructeur de copie de Base). - Utiliser le constructeur de copie du parent * à la place * n'a aucun sens: cela signifierait que * par défaut * les objets seront coupés en copiant. – UncleBens

Répondre

3

Juste un indice.

Est-ce que le code suivant donne la même erreur?

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

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

Oui? Pourquoi? Parce qu'il n'y a pas de conversion de la classe de base à la classe dérivée. Vous devriez définir cette conversion si vous voulez que votre code compile.

Comment ajouter ceci à la classe dérivée?

derived(const base &b){} 

Ça a du sens, hein?

+0

merci pour votre réponse mais je le sais, à la fin j'ai écrit ma question, j'ai lu dans mon livre cette règle, je l'ai mis en œuvre, mais il ne semble pas fonctionner, est-il possible de le faire sans dérivé & b) {}? – rookie

+3

Lisez le commentaire de @UncleBens à votre question. –

Questions connexes