Это модификация вопроса и кода, представленных в этой ссылке: C ++ множественное наследование и vtables . Из этой ссылки я понял, как настраиваются vptr и vtable.
Мой вопрос: как bp-> OutB () извлекает значение int a, являющегося членом classA. Я думал, что мы передаем этот указатель этому методу, который смотрит на часть B класса C. В частности, макет памяти класса C, предполагающий 32 бита.
&obj.
+0: vptr( pointer to virtual method table of classC( for classA).
+4: value of a.
+8: vptr( pointer to virtual method table of classC( for classB).
+12: value of b.
+16: value of c.
Мои вопросы: мы передаем & obj + 8 в качестве этого указателя, когда выполняем: bp-> OutB (), но как это сделать? в итоге получим член: int a класса A в этом случае.
#include <iostream>
using namespace std;
class A
{
public:
virtual void OutA() = 0;
int a;
};
class B
{
public:
virtual void OutB() = 0;
int b;
};
class C : public A, public B
{
void OutA();
void OutB();
int c;
};
void C::OutA()
{
cout << "Out A " << endl;
}
void C::OutB()
{
cout << "Out B " << " a is: " << a << endl;
}
int main()
{
C obj;
obj.a = 10;
obj.b = 20;
obj.c = 30;
obj.OutA();
obj.OutB();
A* ap = (A*)&obj;
B* bp = (B*)&obj;
ap->OutA();
bp->OutB();
return 0;
}