2017-02-22 103 views
0

Рассмотрим:Как сохранить ссылку на производный тип в ссылке базового типа?

struct Base{}; 
struct Derived: Base{}; 

int main() { 
    Derived *d{}; 
    Base *&b = d; // Error: non-const reference to rvalue. 
    (void)b; 
    return 0; 
} 

Как комментарий указывает, назначение пытается сохранить неконстантную ссылку на RValue. Я понимаю, что rvalue является d, преобразованным в Base *. Но как мне обойти эту проблему, поэтому я могу изменить d, назначив b?

+0

Я подозреваю, что вы хотели: 'Derived d; Base & b = d; ' –

+0

@PiotrSkotnicki Нет, мне действительно нужны указатели. – AlwaysLearning

+1

Если это разрешено, вы можете сказать 'b = new Base;'. и 'd' будет указывать на несвязанный объект. –

ответ

1

Чтобы продемонстрировать, почему его проблема, представьте, что вы имели другой-структуру

struct OtherDerived : Base 
{}; 

Теперь рассмотрим, что произойдет, если вы добавили следующую строку после определения б

b = new OtherDerived(); 

это (если это разрешено) должен был бы присвоить d (который имеет тип Derived *) для OtherDerived *, который недействителен, поскольку OtherDerived не является производным от Derive.

Чтобы решить эту проблему, вы можете решить, должен ли указатель, на который вы ссылаетесь, быть производным указателем. Если нет, это может быть базовый указатель, и ваша ссылка на базовый указатель будет тогда ОК.

Derived *d{}; 
Base* pointerToABase = d; 
Base*& refToAPointerToABase = pointerToABase; 

В противном случае, если указатель вы ссылаетесь должен быть Derived * не Base *, то вы можете изменить тип справки: например, замените объявление b.

Derived*& refToAPointerToADerived = d; 

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

Не зная, почему вам нужна ссылка на указатель, трудно предложить альтернативный подход.