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:

  1. для вызова собственных виртуальных методов и переопределенных методов A
  2. для переопределенных методов вызова B

Я запутался в утверждении, что у одного класса есть один vtable, если он полиморфный

1 ответ

Решение

Стандарт C++ не говорит, как это должно быть реализовано. Это зависит от компилятора, если он делает это с помощью нескольких vtables, объединяет vtables [таким образом, что их можно затем снова "разделить", потому что C должно быть возможно сделать в B введите объект еще раз].

Использование нескольких vtables является довольно распространенным решением в компиляторах, поэтому вы увидите это решение как минимум в MS VC++, GNU g++, LLVM/clang++ и ARM armcC++. Поскольку я не знаю, как это работает в других компиляторах, я не могу сказать, используют ли другие методы этот метод или нет (вполне возможно).

Чтобы было ясно, это популярный метод, но стандарт не говорит, как это должно быть сделано.

В будущем это может измениться - кто-то может придумать другое решение, которое лучше (по определению лучше) - например, занимает меньше места, имеет более быстрый доступ и т. Д.)

Другие вопросы по тегам