引用变量和虚函数

Luc*_*uca 6 c++ reference pure-virtual

我在使用引用变量时发现了一种奇怪的行为.

这是类实现:

class Base {
    public:
        virtual void Method() = 0;
};

class DerivedA : public Base {
    public:
        virtual void Method() {}
}

class DerivedB : public Base {
    public:
        virtual void Method() {}
}
Run Code Online (Sandbox Code Playgroud)

这是一个具有奇怪行为的示例代码:

void main(int argc, char *argv[]) {
    DerivedA a;
    DerivedB b;
    Base &base = a;

    base.Method();   // Calls DerivedA::Method

    base = b;
    base.Method();   // Calls DerivedA::Method!!! Why doesn't call DerivedB.Method()?
}
Run Code Online (Sandbox Code Playgroud)

总之,似乎只有在初始化引用变量时才确定与引用变量"关联"的虚函数指针表.如果我重新分配引用变量,则vfpt不会更改.

这里发生了什么?

Mic*_*ker 13

Base &base是一个引用,即a对象的别名,因此赋值base = b相当于a = b,它使得basethingie仍然是同一个类的同一个对象.正如您所假设的那样,它不是指针的重新分配.

  • 我认为这个答案值得绿色剔! (5认同)
  • 是的,我认为这应该是公认的答案. (2认同)

sel*_*rer 7

引用只能初始化一次.您无法将新对象分配给引用.这里实际发生的是调用operator = of Base并且底层对象仍然是DerivedA而不是DerivedB.

  • 每天都有值得学习的东西. (2认同)