2013-06-15 4 views
0

Je lisais le chapitre 13 de l'amorce C++ "Class Inheritance", quelque chose à propos de l'opérateur d'affectation dans la classe dérivée me confondre. Voici le cas: En classe de base:Opérateur d'affectation de classe dérivé C++

class baseDMA 
{ 
    private: 
     char * label;// label will point to dynamic allocated space(use new) 
     int rating; 
    public: 
     baseDMA & operator=(const baseDMA & rs); 
     //remaining declaration... 

}; 
//implementation 
baseDMA & baseDMA::operator=(const baseDMA & rs) 
{ 
     if(this == &rs) 
     { 
      return *this; 
     } 
     delete [] label; 
     label = new char[std::strlen(rs.label) + 1]; 
     std::strcpy(label,rs.label); 
     rating = rs.rating; 
     return *this; 
} 
// remaining implementation 

En classe dérivée

class hasDMA : public baseDMA 
{ 
    private: 
     char * style;// additional pointer in derived class 
    public: 
     hasDMA & operator=(const hasDMA& rs); 
     //remaining declaration... 
}; 
// implementation 
hasDMA & hasDMA::operator=(const hasDMA & hs) 
{ 
    if(this == &hs) 
     return *this; 
    baseDMA::operator=(hs); 
    style = new char[std::strlen(hs.style) + 1]; 
    std::strcpy(style, hs.style); 
    return *this; 
} 
// remaining implementation 

ma question est la suivante: dans la définition de l'opérateur d'affectation de classe dérivée, pourquoi ne pas avoir besoin de supprimer le style d'abord (comme supprimer label dans baseDMA) avant de lui attribuer de nouveaux espaces?

Merci.

+4

Vous devez l'effacer sinon vous perdrez de la mémoire. –

Répondre

0

A ce stade style a un pointeur yo mis en place de l'appel précédent à nouveau char []. Si vous lui attribuez, vous perdez la dernière chance d'appeler la suppression [], et de créer une fuite de mémoire.

À titre de remarque importante, traitez le code que vous montrez simplement comme une démonstration d'un concept. Normalement, vous n'êtes pas censé faire de telles choses directement, mais avoir un membre qui se spécialise dans la tâche, et la classe externe n'a pas besoin de dtor ou op = du tout. Comme pour votre exemple, label et style peuvent être std :: string et le seul dtor et op = qui nécessite hand-crafring est celui de std :: string!