Как чистый виртуальный метод содержит реализацию в базовом классе в C ++? [Дубликат]

Я немного расскажу о ответе user5609829, так как считаю, что другие решения здесь слишком сложны / слишком много работают. Применение margin-right: -4px к встроенным блочным элементам приведет к удалению интервала и будет поддерживаться всеми браузерами. См. Обновленную скрипту здесь . Для тех, кто занимается использованием отрицательных полей, попробуйте дать этот прочитанный.

49
задан Kara 29 June 2013 в 00:52
поделиться

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`
}
70
ответ дан AnT 23 August 2018 в 21:51
поделиться

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

  • «Чистый виртуальный» - это требовать, чтобы производные классы реализовывали свой деструктор.
  • Реализация деструктора вашего базового класса заключается в том, что деструкторы производного класса могут успешно «соединить» потом.
5
ответ дан Chris Jester-Young 23 August 2018 в 21:51
поделиться

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

см. Здесь здесь .

24
ответ дан Prince John Wesley 23 August 2018 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: