(C++,MinGW 4.4.0,Windows 操作系统)
代码中的所有注释,除了标签 <1> 和 <2>,都是我的猜测。如果您认为我在某处错了,请纠正我:
class A {
public:
virtual void disp(); //not necessary to define as placeholder in vtable entry will be
//overwritten when derived class's vtable entry is prepared after
//invoking Base ctor (unless we do new A instead of new B in main() below)
};
class B :public A {
public:
B() : x(100) {}
void disp() {std::printf("%d",x);}
int x;
};
int main() {
A* aptr=new B; //memory model and vtable of B (say vtbl_B) is assigned to aptr
aptr->disp(); //<1> no error
std::printf("%d",aptr->x); //<2> error -> A knows nothing about x
}
<2> 是一个错误并且很明显。为什么 <1> 不是错误?我认为这个调用发生的是:参数是指向成员函数aptr->disp(); --> (*aptr->*(vtbl_B + offset to disp))(aptr)
aptr
的隐式指针。this
在里面disp()
我们会有std::printf("%d",x); --> std::printf("%d",aptr->x); SAME AS std::printf("%d",this->x);
那么为什么 <1> 没有给出错误而 <2> 呢?
(我知道 vtables 是特定于实现的东西,但我仍然认为值得提出这个问题)