Итак, возвращаясь к основам, я пытаюсь разобраться с 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