Очевидно, это зависит от отношений между классами. Другими словами, это выбор дизайна или реализации (то есть зависит от вас, если вы можете разумно его обосновать). Технически ничто не мешает классу иметь сочетание виртуальных, чисто виртуальных, невиртуальных и статических функций-членов.
Если два производных класса переопределяют унаследованную виртуальную функцию и реализуют ее таким же образом, тогда - да - я бы серьезно рассмотрел возможность включения этой функции в базовый класс. Однако есть еще вопросы, которые я хотел бы задать - например, имеет ли смысл для ВСЕХ производных классов по умолчанию использовать эту реализацию функции. С точки зрения повторного использования кода такая вещь может иметь смысл. С точки зрения дизайна - нет.
Тем не менее, если имеет смысл рассматривать конкретную реализацию функции как «стандартную» (т.е. все производные классы по умолчанию используют это, если только они не переопределяют эту функцию), то размещение этого определения в базовом классе не причинит вреда.
В качестве грубого примера того, что вы предлагаете, не имеет смысла, рассмотрим это
class Aircraft
{
public:
virtual void Manoeuvre() = 0;
};
class Hornet : public Aircraft // F/A-18 hornet fighter aircraft
{
public:
void Manoeuvre();
};
class Tomcat : public Aircraft // F-14 tomcat fighter aircraft
{
public:
void Manoeuvre();
};
Предположим, что из-за точности нашего моделирования оба производных класса имеют одинаковые Manoeuvre()
функции - они оба являются сверхзвуковыми истребителями (поэтому, вероятно, будут использоваться аналогичный стиль маневра, хотя и с разной параметризацией). Однако этого недостаточно, чтобы перенести их Manoeuvre()
функцию в базовый класс, потому что есть самолеты, не являющиеся сверхзвуковыми истребителями, например
class Hercules : public Aircraft // C-130 hercules cargo plan
{
public:
void Manoeuvre();
};
В этом случае Hercules
не имеет смысла наследовать маневренность сверхзвукового истребителя, или наоборот. Поэтому нет смысла предоставлять это классом Aircraft
.
В этом случае я мог бы рассмотреть возможность введения промежуточных классов, таких как Fighter
(который мог бы быть общей базой для Hornet
и Tomcat
, но не Hercules
) и - если я хотел бы представить несколько типов грузовых самолетов - возможно, CargoPlane
будет общим база для тех. Тогда и Fighter
, и CargoPlane
могут быть производными от Aircraft
, но Aircraft
не обеспечивает функциональность, которая имеет смысл только для некоторых типов самолетов.
Случайный комментарий: хотя некоторые люди утверждают обратное, в C ++ нет ничего, что мешало бы чистой виртуальной функции иметь определение (реализацию). Это означает, что функция ДОЛЖНА быть переопределена производными классами, но существует определение по умолчанию (которое может быть явно вызвано функциями в производных классах), предоставляемое базовым классом.
person
Peter
schedule
10.01.2017