C ++ чисто виртуальная функция имеет тело - PullRequest
57 голосов
/ 30 марта 2011

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

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

Ответы [ 3 ]

86 голосов
/ 30 марта 2011

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

На языке 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`
}
26 голосов
/ 30 марта 2011

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

см. здесь .

7 голосов
/ 30 марта 2011

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

  • «Чистый виртуальный» - это требование, чтобы производные классы реализовали свой деструктор.
  • Ваша реализация деструктора базового класса такова, что деструкторы производного класса могут после этого успешно "цепляться".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...