Tabelas virtuais e layout de memória em várias heranças virtuais
Considere seguir a hierarquia:
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; }
};
Qual é oexato layout de memória deC
instância? Quantos vptrs contém, onde exatamente cada um deles é colocado? Quais das tabelas virtuais são compartilhadas com a tabela virtual de C? O que exatamente cada tabela virtual contém?
Aqui como entendo o layout:
----------------------------------------------------------------
|vptr1 | AptrOfB1 | b1 | B2ptr | c | vptr2 | AptrOfB2 | b2 | a |
----------------------------------------------------------------
OndeAptrOfBx
é o ponteiro paraA
exemplo queBx
contém (desde que a herança é virtual).
Isso está correto? Quais funçõesvptr1
aponta para? Quais funçõesvptr2
aponta para?
Dado o seguinte código
C* c = new C();
dynamic_cast<B1*>(c)->f(3);
static_cast<B2*>(c)->f(3);
reinterpret_cast<B2*>(c)->f(3);
Por que todas as chamadas paraf
impressão33
?