Имеет ли смысл определять «чистые» виртуальные функции в самом базовом классе? - PullRequest
12 голосов
/ 09 ноября 2011

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

Даже если мы определим виртуальные функции pure в самом базовом классе, нам все равно придется определять их и в производных классах.

#include <iostream>
using namespace std;

class speciesFamily
{
    public:
        virtual void numberOfLegs () = 0;
};

void speciesFamily :: numberOfLegs ()
{
    cout << "\nFour";
}

class catFamily : public speciesFamily
{
    public:
        void numberOfLegs ()
        {
            speciesFamily :: numberOfLegs ();
        }
};

Это может показаться странным, но есть ли ситуации, когда полезно определять чисто виртуальную функцию в самом базовом классе?

Ответы [ 4 ]

14 голосов
/ 09 ноября 2011

Две вещи:

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

struct EmptyAbstract
{
  virtual ~EmptyAbstract() = 0; // force class to be abstract
};
EmptyAbstract::~EmptyAbstract() { } // but still make d'tor callable

Это может помочь вам минимизировать размер реализации абстрактного класса.Это как-то микрооптимизация, но если она подходит семантически, тогда хорошо иметь эту опцию.

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

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

struct Derived : Base
{
  virtual void foo()
  {
    Base::foo();  // call common features
    // do other stuff
  }
};

void Base::foo() { /* common features here */ }
11 голосов
/ 09 ноября 2011

Существуют ли ситуации, когда полезно определить чисто виртуальную функцию в самом базовом классе?

Да - если рассматриваемая функция является чистым виртуальным деструктором, она должна также определяться базовым классом.

0 голосов
/ 09 ноября 2011

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

0 голосов
/ 09 ноября 2011

Базовый класс с только чисто виртуальными функциями - это то, что языки, подобные Java, называют интерфейсом. Он просто описывает, какие функции доступны, больше ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...