Почему приведение Derived ** к Base * const * запрещено? - PullRequest
3 голосов
/ 22 марта 2010

Прочитав этот вопрос , я увидел ответ Навина, содержащий ссылку на эту страницу, которая в основном говорит, что приведение из Derived ** к Base ** запрещено, поскольку может изменить указатель на указатель на объект Derived1 на указатель на объект Derived2 (например: *derived1PtrPtr=derived2Ptr).

Хорошо, я понимаю, что это зло ...

Но при приведении Derived** к Base*const* это даже невозможно, так в чем причина, что это все равно не разрешено?

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Во-первых, если вам действительно нужно, вы можете привести любой тип указателя к любому другому типу указателя.Например, вы можете привести к void* в качестве промежуточного шага.

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

По сути, у вас есть указатель на X - где X в вашем случае оказывается другим указателем.Некоторые X случаи получают специальную обработку (например, производные классы могут неявно приводиться к базам) - но ваш X не является одним из них.Это не базовый класс - это указатель.Не существует неявных приведений, определенных для derived**, кроме void* - вы даже не можете явным образом привести derived** к void**.

Не думаю, что const имеет многов этом случае, хотя я мог что-то упустить.

0 голосов
/ 22 марта 2010

Невозможно привести Derived** к Base** в случае множественного наследования. База может находиться где угодно внутри объекта, то есть значение в первом указателе нужно будет изменить. И в вашем случае этот указатель четный (становится) const. Поэтому вам нужно ввести новую переменную и назначить.

В вероятном случае одиночного наследования, я полагаю, reinterpret_cast определил бы поведение из-за гарантий размещения памяти Хотя, безусловно, есть над чем подумать дважды.

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