Где vptr (виртуальный указатель) инициализируется в классе, имеющем только параметризованные конструкторы?

Предположим, у меня есть такой класс

class Base
{
    private:
        int i;
        int j;
    public:
        Base(int i)
        {
            this->i = i;
            j = 0;
        }
        Base(int i, int j)
        {
            this->i = i;
            this->j = j;
        }
        virtual void f()
        {
            cout<<"in base f()"<<endl;
        }
};

VPTR инициализируется в начале конструктора. Но в этом случае нет конструктора по умолчанию, только 2 параметризованных конструктора. Где будет инициализирован VPTR?

2 ответа

Решение

Где vptr (виртуальный указатель) инициализируется в классе, имеющем только параметризованные конструкторы?

Чтобы быть строго техническим, это полностью определяется реализацией.
Однако почти известные компиляторы реализуют динамическую диспетчеризацию через механизм vptr и v-table. Все эти компиляторы будут инициализировать vptr так, чтобы он указывал на свою собственную v-таблицу в списке инициализации членов каждого конструктора.

Что-то вроде:

Base::Base(...arbitrary params...)
   : __vptr(&Base::__vtable[0])  ← supplied by the compiler, hidden from the programmer
 {

 }

Этот C++ FAQ объясняет суть того, что именно происходит.

Каждый конструктор сначала инициализирует vptr псевдо-поле. Вы можете представить, что это первое скрытое поле каждого класса C++, имеющего virtual функции-члены.

Теоретически возможно реализовать виртуальные функции без указателя виртуальной таблицы, но я не знаю обычной реализации C++, делающей это.

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