如何在基类型引用中存储对派生类型的引用?

时间:2017-02-22 13:15:03

标签: c++ inheritance polymorphism

考虑:

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

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

如注释所示,赋值尝试将非const引用存储到rvalue。我了解rvalue是d转换为Base *。但是,如何解决此问题,以便通过分配到d来更改b

1 个答案:

答案 0 :(得分:1)

为了说明问题的原因,想象一下你有另一个结构

struct OtherDerived : Base
{};

现在考虑如果在定义b

之后添加以下行会发生什么
b = new OtherDerived();

这个(如果允许的话)必须将d(其类型为Derived *)分配给OtherDerived *,这是无效的,因为OtherDerived不是从Derive派生的。

要解决此问题,您可以决定实际引用的指针是否需要是派生指针。如果不是,它可以是一个基指针,那么你对基指针的引用就可以了。

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

否则,如果您引用的指针必须是Derived *而不是Base *,那么您可以更改引用的类型:例如用。替换b的声明。

    Derived*& refToAPointerToADerived = d;

我知道这不是你在问题的标题中实际要求的 - 但正如所描述的那样,你不能这样做。

如果不知道为什么需要引用指针,很难建议另一种方法。