Can the class have more than one vtable?
say, we have such classes inheritance
class A
{
int a;
public:
A(){}
virtual void f1(){}
};
class B
{
int b;
public:
B(){}
virtual void f2(){}
virtual void f3(){}
};
class C: public A, public B
{
int c;
public:
C(){}
virtual void f1(){}
virtual void f2(){}
virtual void f3(){}
virtual void f4(){}
};
And the object: C c;
In object c we have vptr to one vtable, consists of methods of A+C, and another vtable consists of methods for B. For example x64 build:
- +0: vtable A+C
- +8: int a + padding to 8 byte
- +16: vtable B
- +24: int b + padding to 8 byte
- +32: int c + заполнение до 8 байт
Class C
есть два экземпляра vtable:
- для вызова собственных виртуальных методов и переопределенных методов A
- для переопределенных методов вызова B
Я запутался в утверждении, что у одного класса есть один vtable, если он полиморфный
1 ответ
Стандарт C++ не говорит, как это должно быть реализовано. Это зависит от компилятора, если он делает это с помощью нескольких vtables, объединяет vtables [таким образом, что их можно затем снова "разделить", потому что C
должно быть возможно сделать в B
введите объект еще раз].
Использование нескольких vtables является довольно распространенным решением в компиляторах, поэтому вы увидите это решение как минимум в MS VC++, GNU g++, LLVM/clang++ и ARM armcC++. Поскольку я не знаю, как это работает в других компиляторах, я не могу сказать, используют ли другие методы этот метод или нет (вполне возможно).
Чтобы было ясно, это популярный метод, но стандарт не говорит, как это должно быть сделано.
В будущем это может измениться - кто-то может придумать другое решение, которое лучше (по определению лучше) - например, занимает меньше места, имеет более быстрый доступ и т. Д.)