Войти

Показать полную графическую версию : Вызвать перегруженный оператор присваивания суперкласса.


Smasher
08-02-2012, 22:12
Есть вопрос касающийся кода, который (почти) целиком лежит там (http://pastie.org/3336164).
Как видно, существует класс Becher и подкласс BecherMitAufdruck. В суперклассе я создал перегруженный оператор присваивания.

Becher& Becher::operator=(const Becher &b)
{
if (this != &b)
{
delete [] inhalt;
inhalt = strdupnew(b.inhalt);
fassungsvermoegen = b.fassungsvermoegen;
fuellgrad = b.fuellgrad;
}
return *this;
}

В подклассе я тоже перегружаю этот оператор.

BecherMitAufdruck& BecherMitAufdruck::operator=(const BecherMitAufdruck &b)
{
if (this != &b)
{
delete [] inhalt;
delete [] aufdruck;
inhalt = strdupnew(b.inhalt);
aufdruck = strdupnew(b.aufdruck);
fassungsvermoegen = b.fassungsvermoegen;
fuellgrad = b.fuellgrad;
}
return *this;
}

Я хотел бы в подклассе выззвать перегруженный оператор суперкласса, а не писать для каждого параметра отдельное присваивание, т.к. за счёт этого частично теряется смысл наследования. Я пробовал

(Becher)(*this) = (Becher)b;

но это не работает. Понятно, что следует как-то определенить пространство имен, например

Becher::operator=(b)

но как это вызвать для объекта *this мне непонятно.

PhilB
10-02-2012, 20:36
Думаю, нормальным решением будет следующее.
Поясню на примере класса Becher.
Создаются вспомогательные методы

void Becher::_copy(const Becher &b) {
inhalt = strdupnew(b.inhalt);
fassungsvermoegen = b.fassungsvermoegen;
fuellgrad = b.fuellgrad;
}

void Becher::_destroy() {
delete [] inhalt;
}
И основные методы будут вызывать их.

Becher& Becher::operator=(const Becher &b) {
if (this != &b) {
_destroy();
_copy(b);
}
return *this;
}
Becher::~Becher() { _destroy(); }
Becher::Becher(const Becher &b) { _copy(b); }
Далее, в классе потомке, по аналогии создаются основные методы, вспомогательные же будут вызывать сначала впомогательные методы класса-родителя, а затем выполнять свою собственную работу.

void BecherMitAufdruck::_copy(const BecherMitAufdruck &b) {
Becher::_copy(b);
aufdruck = strdupnew(b.aufdruck);
}

BecherMitAufdruck& BecherMitAufdruck::operator=(const BecherMitAufdruck &b) {
if (this != &b) {
_destroy();
_copy(b);
}
return *this;
}
Остальное по аналогии.

Надеюсь, мысль ясна.

El Scorpio
14-02-2012, 04:01
но как это вызвать для объекта *this мне непонятно. »
Элементарно, Ватсон. Пишешь
Becher::operator=(b);
И вызывается соответствующий метод соответствующего базового класса для объекта this
Также можно вызывать все остальные операторы базовых классов




© OSzone.net 2001-2012