class Base
{
public:
virtual void function1() {};
virtual void function2() {};
};
class D1: public Base
{
public:
virtual void function1() {};
};
class D2: public Base
{
public:
virtual void function2() {};
};
для приведенного выше примера будет создано 3 V.tables(источник).
Если я удалю виртуальное ключевое слово для функций в D1, D2 будет ли этот код создавать еще 3 v.tables?
Во-первых, если функция-член объявлена как виртуальная в базе, тогда она будет виртуальной во всех производных классах, если вы явно укажете это или нет. (Хотя это зависит от реализации)
Во-вторых, каждый класс, имеющий хотя бы одну функцию, имеет для него одну и только одну vtable. Таким образом, для вашего вопроса, даже если вы удалите виртуальные из своих производных функций класса, они останутся виртуальными, и для каждого класса будет три vtables (ON MOST OF IMEMENTEMENTATIONS).
Base::vtable
может перекрывать одну из производных vtables. Теоретический компилятор может даже создать одну vtable здесь. Так как стандарт C ++ ничего не говорит о vtables, вполне нормально иметь дыры в vtable из D2.