基类引用 - 为其指定其他类型

AMC*_*der 12 c++ reference

以下示例中会发生什么?

struct B { };
struct D1 : B  { };
struct D2 : B  { };
int main()
{
    D1 d;
    D2 d2;
    B& x = d;
    x = d2;
}
Run Code Online (Sandbox Code Playgroud)

我知道引用没有重新分配.x仍然指的是d,但是你怎么分配d2d

多一点:

struct B
{
    B () { x = 0; }
    int x;
    virtual void foo () { cout << "B" << endl; }
};
struct D1 : B
{
    D1 () { x = 1; }
    virtual void foo () { cout << "D1" << endl; }
};
struct D2 : B
{
    D2 () { x = 2; }
    virtual void foo () { cout << "D2" << endl; }
};

int main()
{
D1 d;
D2 d2;
B& x = d;
x.foo();   //D1
               //x.x is 1 here
x = d2;
x.foo();   //also D1
               //but x.x is 2 here
}
Run Code Online (Sandbox Code Playgroud)

它似乎x.x更新了,但vftable不是......为什么?

Pot*_*ter 11

xB基类子对象d.赋值从基础子对象x = d2 切片并将其值赋给子对象.Bd2d

这通常不是故意做的.

编辑:

似乎xx已更新,但vftable不是......为什么?

这就是赋值运算符的B::operator=作用.C++中的基类完全没有意识到它们是基类.此外,在其生命周期内不能改变对象的类型.最接近的选择是C++ 11 std::move,它可以将一个旧B对象转移D1到一个新D2对象中.然后,您将销毁旧对象.

  • @KonradRudolph您需要双重调度才能使其工作,因为基类不理解没有RTTI的派生参数. (3认同)