статическое / динамическое приведение ссылок / объектов - PullRequest
2 голосов
/ 17 января 2012

Некоторое время назад я играл с кучей операторов кастинга, что, по-видимому, в тот момент я не получал.Я просматривал свой код сейчас и увидел следующее:

Base(Derived &p_derived) : m_state(static_cast<Base>(p_derived).m_state){}

Я думаю, что теперь я получил лучшее понимание приведения указателей и ссылок благодаря очень хорошему ответу здесьstackoverflow, но теперь есть вовлеченные объекты.Что именно происходит, когда ссылка приводится к объекту?Или что, если p_derived был сам объект, а не просто ссылка?Будет ли это создавать новые объекты, и если да, как они будут созданы?Заявленное значение не должно знать, что оно на самом деле происходит от Base.В другом месте я пытался выполнить статическое приведение из Derived * к Base *, но это не должно компилироваться из-за несовместимости типов для этой единицы перевода.

1 Ответ

6 голосов
/ 17 января 2012

Когда вы используете ссылку, вы обычно используете объект, на который она ссылается. Это волшебная прозрачность ссылочного синтаксиса, которую вы не получаете с указателями; возможно, это их причина существования.

Этот сценарий не является исключением: вы берете p_derived рефери и создаете из него новый Base путем нарезки.

static_cast<Base&>(p_derived) будет разыгрывать саму ссылку , если это то, что вам нужно (и даже если это не так: P).

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

Да, меня это тоже удивляет. Уверены ли вы? ( Демо / Демо - не уверен, какой вы используете)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...