Я прочитал статью о виртуальной таблице в Википедии .
class B1
{
public:
void f0() {}
virtual void f1() {}
int int_in_b1;
};
class B2
{
public:
virtual void f2() {}
int int_in_b2;
};
used to derive the following class:
class D : public B1, public B2
{
public:
void d() {}
void f2() {} // override B2::f2()
int int_in_d;
};
После прочтения я не мог не задуматься о том, как не виртуальные функции-члены реализованы в C ++. Есть ли отдельная таблица, такая как v-таблица, в которой хранятся все адреса функций? Если да, как называется эта таблица и что происходит с ней во время наследования?
Если нет, то как компилятор понимает эти утверждения?
D * d1 = new D;
d1->f0(); // statement 1
Как компилятор интерпретирует, что f0 () является функцией B1, и, поскольку D публично унаследовал D, он может обращаться к f0 (). Согласно статье компилятор изменяет утверждение 1 на
(*B1::f0)(d)