Распространенный способ вызова оператора материнского класса = в C ++? - PullRequest
2 голосов
/ 12 ноября 2009

Предположим, у меня есть класс Dog, который наследуется от класса Animal, Вы можете вставить вызов Animal :: operator = в Dog :: operator =.

Какой самый читаемый / распространенный способ написать это?

Я думаю, что знаю этих двоих ...

static_cast<Animal*>(this)->operator=(other);

и

this->Animal::operator=(other);

Ответы [ 2 ]

12 голосов
/ 12 ноября 2009

Так как вы делаете это из метода дочернего класса

Animal::operator=(other);

Нет необходимости в this->. Синтаксис разрешения контекста делает именно то, что было запрошено. Я не вижу смысла в том, чтобы делать это "косвенно" с использованием актеров.

Также обратите внимание, что выполнение этого с приведением может не привести к ожидаемому результату в общем случае, так как оно не отключит динамическое разрешение виртуального вызова метода. (И, кстати, оператор присваивания может быть объявлен виртуальным). Очевидным следствием этого является то, что при использовании виртуальных методов вариант «cast» может легко привести к бесконечной рекурсии.

6 голосов
/ 12 ноября 2009

this->Animal::operator=(other); - правильный путь, вы полностью квалифицируете метод, ссылающийся на вашу родительскую реализацию, вам не нужно приводить себя к этому, и это затрудняет чтение кода.

...