我在使用引用变量时发现了一种奇怪的行为。
以下是类实现:
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 不会改变。
这里发生了什么?
答案 0 :(得分:13)
Base &base
是一个引用,即a
对象的别名,因此作业base = b
等同于a = b
,这使得base
对象仍然存在同一个类的同一个对象。它似乎不是你指定的指针重新分配。
答案 1 :(得分:7)
参考只能初始化一次。您无法将新对象分配给引用。这里实际发生的是调用operator = of Base并且底层对象仍然是DerivedA而不是DerivedB。