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