Я пытаюсь понять размещение виртуального указателя внутри объекта и хотел бы получить некоторые пояснения. Я рассмотрел два разных сценария: полиморфизм и множественное наследование. У обоих разные ответы на вопрос, где находится виртуальный указатель.
Полиморфизм
Виртуальный указатель находится в верхней части объекта и только для этого класса, то есть существует только один виртуальный указатель. Например:
class A {
public:
virtual void walk();
}
class B : A {
public:
int num;
virtual void walk();
virtual void run();
}
Тогда объект в памяти будет выглядеть так:
| vPointer to class B vTable |
| int num |
Множественное наследование
Существует несколько виртуальных указателей, по одному для каждого класса. Однако виртуальные таблицы для этих классов изменены таким образом, что методы перезаписываются и направляются по адресу текущего функционального кода классов. Однако я думаю, что это будет означать, что каждый класс потенциально может иметь несколько разных vTables. Например:
class A {
public:
virtual void walk();
}
class B {
public:
char name;
virtual void run();
}
class C : A, B {
public:
int num;
virtual void run();
virtual void walk();
virtual void swim();
}
Тогда объект в памяти будет выглядеть так:
| vPointer to class A vTable |
| vPointer to class B vTable |
| char name |
| int num |
Являются ли оба или любой из них правильными? Я искал вокруг, но могу найти только разъяснения по множественному наследованию без полиморфизма.
Любая помощь приветствуется.
Спасибо.