这个问题是萦绕在我脑海中的一大疑问,也很难用语言来形容。有时它似乎很明显,有时很难破解。所以问题是这样的::
类基{ 上市: int a_number; 根据(){} 虚空函数 1() {} 虚空函数 2() {} 无效函数3(){} }; 类派生:公共基础{ 上市: 派生():基(){} void function1() {cout << "从基础派生" << endl; virtual void function4() {cout << "仅在派生中" << endl;} }; 诠释主要(){ 派生 *der_ptr = new Derived(); 基 *b_ptr = der_ptr; // 因为只是地址被传递,b_ptr 指向派生对象 b_ptr->函数4();// 将给出编译错误!! b_ptr->函数1();// 调用 Derived 类的重写方法 返回0; }
Q1。虽然 b_ptr 指向 Derived 对象,但它访问哪个 VTABLE 以及如何?因为 b_ptr -> function4() 给出了编译错误。还是 b_ptr 在派生的 VTABLE 中只能访问该大小的基类 VTABLE?
Q2。既然 Derived 的内存布局必须是 (Base,Derived) ,那么 Base 类的 VTABLE 是否也包含在 Derived 类的内存布局中?
Q3。既然Vtable基类的function1和function2指向Base类的实现,Derived类的function2指向Base类的function2,那么Base类中真的需要VTABLE吗?(这可能是我能问过的最愚蠢的问题,但在我目前的状态下我仍然对此表示怀疑,答案必须与 Q1 的答案相关 :))
请评论。
谢谢你的耐心。