Подтвердить что ты не робот

Чистая виртуальная функция С++ имеет тело

Чистые виртуальные функции (когда мы устанавливаем = 0) также можем иметь тело функции.

В чем состоит использование тела функции для чистых виртуальных функций, если они вообще не вызываются?

4b9b3361

Ответ 1

Ваше предположение, что чистая виртуальная функция не может быть вызвано, абсолютно неверна. Когда функция объявляется чистой виртуальной, это просто означает, что эту функцию нельзя получить динамически, посредством виртуального механизма отправки. Тем не менее, эту же функцию можно легко назвать статически, без виртуальной отправки.

В языке С++ статический вызов виртуальной функции выполняется, когда в вызове используется квалифицированное имя функции, т.е. когда имя функции, указанное в вызове, имеет форму <class name>::<function name>.

Например

struct S {
  virtual void foo() = 0;
};

void S::foo() {
  // body for the pure virtual function `S::foo`
}

struct D : S {
  void foo() {
    S::foo(); // static call to `S::foo` from derived class
  }
};

int main() {
  D d;
  d.S::foo(); // another static call to `S::foo`
}

Ответ 2

"Эффективный С++" Майерс упоминает причина чистой виртуальной функции иметь тело: производные классы, которые реализовать эту чистую виртуальную функцию может вызвать эту реализацию smwhere в их коде. Если часть кода два разных производных класса аналогично, тогда имеет смысл перемещать его в иерархии, даже если функция должна быть чистой виртуальной.

см. здесь.

Ответ 3

Для большинства чистых виртуальных функций вы были бы правы. Однако для чистого виртуального деструктора на самом деле важно определить соответствующую реализацию деструктора:

  • "Чистый виртуальный" - это требовать, чтобы производные классы реализовали свой деструктор.
  • Реализация деструктора вашего базового класса заключается в том, что деструкторы производного класса могут успешно "сгруппироваться" после.