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

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

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

#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 ответов


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

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


две вещи:

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

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

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

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

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 */ }

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


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