где 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?

0

Решение

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

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

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

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

}

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

3

Другие решения

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

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

3

По вопросам рекламы [email protected]