【发布时间】:2012-03-08 13:50:20
【问题描述】:
考虑这段代码:
class X { public: int i; };
class A : public virtual X { public: int j; };
class B : public virtual X { public: double d; };
class C : public A, public B { public: int k; };
// cannot resolve location of pa->X::i at compile-time
void foo( const A* pa ) { pa->i = 1024; }
main() {
foo( new A );
foo( new C );
// ...
}
在《Inside C++ object model》一书中说:
编译器无法修复通过
X::i访问的物理偏移量pa在foo()中,因为pa的实际类型可能随每个foo()'s调用。
因此,编译器必须创建如下内容:
// possible compiler transformation
void foo( const A* pa ) { pa->__vbcX->i = 1024; }
如果程序有一个指向虚拟基类的指针,它怎么不能在编译时解析那个成员的内存地址呢?据我所知,在创建每个派生类对象时,每个对象的内存布局包括:
- 基类中的所有成员
- 一个虚拟指针(虚拟析构函数的)
- 指向派生对象的虚拟基类的指针
- 派生类对象的所有成员。
因此,找到基类成员应该只是找到与派生类对象起始地址的正确偏移量。但是为什么不能解决呢?
【问题讨论】:
标签: c++ class inheritance