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


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

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

3 51

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 в своем коде. Если часть кода два разных производных классов похоже тогда имеет смысл его передвинуть вверх по иерархии, даже если функция должна быть чисто виртуальной.

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

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

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