考虑以下层次结构:
struct A {
int a;
A() { f(0); }
A(int i) { f(i); }
virtual void f(int i) { cout << i; }
};
struct B1 : virtual A {
int b1;
B1(int i) : A(i) { f(i); }
virtual void f(int i) { cout << i+10; }
};
struct B2 : virtual A {
int b2;
B2(int i) : A(i) { f(i); }
virtual void f(int i) { cout << i+20; }
};
struct C : B1, virtual B2 {
int c;
C() : B1(6),B2(3),A(1){}
virtual void f(int i) { cout << i+30; }
};
C 实例的精确的内存布局是什么?它包含多少个 vptrs,每个 vptrs 究竟放在哪里?哪些虚表与 C 的虚表共享?每个虚表具体包含什么?
这里是我对布局的理解:
---------------------------------------------------------------- |vptr1 | AptrOfB1 | b1 | B2ptr | c | vptr2 | AptrOfB2 | b2 | a | ----------------------------------------------------------------
AptrOfBx
是指向A
实例的指针,该实例被包含在Bx
中(由于继承是虚拟的)。
这个说法正确吗?vptr1
指向哪些函数?vptr2
指向哪些函数?给定以下代码:
C* c = new C(); dynamic_cast<B1*>(c)->f(3); static_cast<B2*>(c)->f(3); reinterpret_cast<B2*>(c)->f(3);
为什么所有对
f
的调用都会打印出33
?
C foo; intptr_t offsetB1 = (intptr_t)(B1*)&foo - (intptr_t)&foo;
,其他基类的起始位置也可以类似地推导出来。此外,计算所有类的sizeof
应该能给你另一个很好的线索。 - cmaster - reinstate monica