引用变量和虚函数

时间:2011-12-03 10:39:40

标签: 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() {}
}

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

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()?
}

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

这里发生了什么?

2 个答案:

答案 0 :(得分:13)

Base &base是一个引用,即a对象的别名,因此作业base = b等同于a = b,这使得base对象仍然存在同一个类的同一个对象。它似乎不是你指定的指针重新分配。

答案 1 :(得分:7)

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