Предположим, у меня есть такой класс
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?
Где 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 ++, делающей это.