Есть
замечательная статья про виртуальное наследование. Но к сожалению, почему-то в этой статье не описывается, что происходит с виртуальными функциями при виртуальном наследовании.
Допустим есть такая иерархия классов:
class A
{
int a;
public:
virtual void foo(){ std::cout << "A";};
};
class B1 : virtual public A
{
int b1;
public:
virtual void foo(){ std::cout << "B1";};
};
class B2 : virtual public A
{
int b2;
public:
virtual void foo(){ std::cout << "B2";};
};
class C : public B1, public B2
{
int c;
};
Допустим где-то в коде встречается такое место:
A* a = new C;
a->foo();
Какая функция будет вызвана в этом случае?
Почему будет вызвана именно она? Можно ли это объяснить в терминах указателей на на таблицы виртуальных функций, как в приведенной статье?