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仍然是同一个类的同一个对象.正如您所假设的那样,它不是指针的重新分配.
引用只能初始化一次.您无法将新对象分配给引用.这里实际发生的是调用operator = of Base并且底层对象仍然是DerivedA而不是DerivedB.