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

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

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

3 ответов


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

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

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

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

struct D : S 
{
  void foo() 
  {
    S::foo();       
    // Non-virtual call to `S::foo` from derived class

    this->S::foo(); 
    // Alternative syntax to perform the same non-virtual call 
    // to `S::foo` from derived class
  }
};

int main() 
{
  D d;

  d.S::foo(); 
  // Another non-virtual call to `S::foo`
}

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

посмотреть здесь.


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

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