Согласно Скотту Мейерсу: static_cast<PC*>(this);
создаст временную базовую копию SmartPC.но temp->display();
выполнил функцию display()
производного класса, почему это так?он должен выполнять функцию базы display()
, поскольку объект теперь полностью является копией базы SmartPC.
Копия не создается, вы только приводите указатель .
Поскольку класс полиморфный, вызов функции virtual
через указатель приводит к вызову «правильной» версии функции (в соответствии с динамическим типом объекта, который являетсяSmartPC *
).
Если бы вместо этого display
не было virtual
, была бы вызвана версия базового класса, поскольку для не virtual
методов это статический тип указателя для определения, какая версия должна быть вызвана.
(display
равно virtual
также в SmartPC
, даже если это явно не указано, при переопределении унаследованного подразумевается квалификатор virtual
virtual
функций)
Обратите внимание, что если бы вы сделали:
PC temp(*this);
, вы бы на самом деле создали копию текущего объекта, "нарезанного", чтобы быть объектом типа PC
.Это называется «разрезанием объектов» и выполняется конструктором копирования PC
;чаще всего это нежелательное поведение (потому что то, что было объектом производного класса, фактически становится объектом базового класса, и полиморфизм не работает, как некоторые могут ожидать).
Другой вопрос: если я добавлю строку temp->data;
в convert()
функцию, она скажет, что PC::Data
защищена, но я получаю к ней доступ из области видимости производного класса, например SmartPC
, так почемуэто работает?
Концептуально, когда вы пытаетесь получить доступ к temp->data
, вы пытаетесь получить доступ к private
члену другого объекта (не важно, что temp
на самом деле this
), поэтому доступ запрещен.Ваши "привилегии производного класса" для доступа к protected
членам работают только на this
.