Там уже появилось два хороших ответа, когда я писал это, но я все равно отправляю, потому что он написан в другом стиле. Возможно, этот более мелкий ответ полезен кому-то.
Прежде всего, это немного неясно, когда метод copy
является частью объекта, принимает объект как вход и возвращает объект. Копирует ли он с или на вход? Возвращает ли она копию или себя? Предполагается, что это static
?
Все ваши декларации «работают» (в зависимости от того, чего вы хотите достичь), но не все вместе.
Редактировать: я удалил часть, оспариваемую в комментариях, другие ответы покрывают это в любом случае. Но я сохранил часть, дающую пример, чтобы объяснить, почему полиморфизм по типу возврата недопустим.
Для реализации только использования в Derived
, вы можете объявить
class Derived:public Base{
public:
virtual Derived* copy(Base* b){...};
virtual Derived* copy(Derived* b){};
};
или
class Derived:public Base{
public:
virtual Base* copy(Base* b){...};
virtual Derived* copy(Derived* b){};
};
полиморфизм на основе возвратного типа не поддерживается в C++, однако. Вы не можно использовать
class Derived:public Base{
public:
virtual Base* copy(Derived* b){...};
virtual Derived* copy(Derived* b){};
};
, потому что компилятор будет иметь проблемы, определяющий, что делать, если вы не используете результат. Рассмотрим:
Derived * d = new Derived();
Derived * toCopy = new Derived();
Base * b2 = toCopy->copy(d); // Should use use the version returning Base
Derived * d2 = toCopy->copy(d); // Should use the version returning Derived
toCopy->copy(d2); // Which implementation should the compiler pick? It cannot know!
Поскольку компилятор не может принять решение о версии для использования в последней строке выше, является незаконным перегружать на тип возвращаемого значения.
Что касается права доступа, я с радостью рекомендую другие ответы.
Я не понимаю ваш вопрос. Вы можете перефразировать его? Вы спрашиваете о правилах для _overriding_ виртуальных функций? –
да, я перефразирую его сейчас. – Ghostblade