C++ множественное наследование и виртуальные таблицы

Итак, возвращаясь к основам, я пытаюсь разобраться с vtables и еще чем-то. В следующем примере, если бы я, скажем, передал B*какой-либо функции, как эта функция узнает, что нужно вызывать методы из vtable объекта Cвместо методов из vtable объекта A? Существуют ли две отдельные таблицы VTable, которые передаются этому объекту? Являются ли указатели интерфейса просто vtables (, поскольку интерфейсы, IIRC,не может содержать объявления свойств )?

Я пытаюсь сказать, что до тех пор, пока я не попробовал этот код, я исходил из того, что вы не можете наследовать более одного интерфейса/класса за раз (и что все интерфейсы должны быть линейный, так сказать ), чтобы vtable строилась сама на себя.

Если бы мое представление о том, как работают vtables , было правильным (, что, как я теперь знаю, неверно ), то передача B*и вызов B::OutB()вызвали бы A:OutA()вместо (что, очевидно, не так ).

Может кто-нибудь пролить свет?

// Includes
#include <windows.h>
#include <iostream>

interface A
{
public:
    virtual void OutA() = 0;
};

interface B
{
public:
    virtual void OutB() = 0;
};

class C : public A, public B
{
public:
    void OutA();
    void OutB();
};

void C::OutA()
{
    printf("Out A\n");
}

void C::OutB()
{
    printf("Out B\n");
}

int main()
{
    C obj;
    obj.OutA();
    obj.OutB();

    A* ap = (A*)&obj;
    B* bp = (B*)&obj;

    ap->OutA();
    bp->OutB();

    system("pause");

    // Return
    return 0;
}

выходы (как и ожидалось):

Out A
Out B
Out A
Out B
5
задан Hans Passant 22 May 2015 в 17:03
поделиться