C ++ множественное наследование и vtables: с доступом к переменной-члену, а не с доступом к методу - PullRequest
0 голосов
/ 14 января 2020

Это модификация вопроса и кода, представленных в этой ссылке: 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;
}
...