Сколько V Табелей будет создано?

0
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?

  • 0
    @mat Ваше редактирование пропустило несколько бит, посмотрите другие вещи, которые я исправил
  • 0
    vtables зависят от реализации, а интеллектуальная реализация сгенерирует только два. Это потому, что Base::vtable может перекрывать одну из производных vtables. Теоретический компилятор может даже создать одну vtable здесь. Так как стандарт C ++ ничего не говорит о vtables, вполне нормально иметь дыры в vtable из D2.
Теги:
vtable

1 ответ

1

Во-первых, если функция-член объявлена как виртуальная в базе, тогда она будет виртуальной во всех производных классах, если вы явно укажете это или нет. (Хотя это зависит от реализации)

Во-вторых, каждый класс, имеющий хотя бы одну функцию, имеет для него одну и только одну vtable. Таким образом, для вашего вопроса, даже если вы удалите виртуальные из своих производных функций класса, они останутся виртуальными, и для каждого класса будет три vtables (ON MOST OF IMEMENTEMENTATIONS).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню