C ++ производный оператор присваивания класса

Я читал C ++ Primer главу 13 «Наследование классов», кое-что об операторе присваивания в производном классе меня смущает. Вот случай:
В базовом классе:

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

В производном классе

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

мой вопрос: в определении оператора присваивания производного класса, почему не нужно сначала удалять стиль (например, удалить метку в baseDMA), прежде чем выделять ему новые пробелы?

Спасибо.

0

Решение

В таком случае style имеет указатель, настроенный с предыдущего вызова на новый символ []. Если вы назначите его, вы потеряете последний шанс вызвать delete [] и создать утечку памяти.

В качестве важного примечания трактуйте код, который вы показываете, как демонстрацию концепции. Обычно вы не должны делать такие вещи напрямую, но имеете член, который специализируется на задаче, а внешний класс вообще не нуждается в dtor или op =. Как и в вашем примере, метка и стиль могут быть std :: string, и единственный dtor и op =, требующий ручного изготовления, — это std :: string!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector