Вариант 1
Вы можете рассмотреть возможность использования своей наиболее распространенной реализации в классе Base
.Главной особенностью или недостатком этого метода является то, что базовый класс больше не будет абстрактным.Если это проблема, перейдите к варианту 2.
Возможно, вы даже сможете справиться с различиями в производных классах, используя шаблон метода шаблона для извлечения различийв защищенных виртуальных функциях, вызываемых методом шаблона.
В любом случае, для производных классов, которые требуют совершенно другого подхода, вы просто переопределяете метод Base class '.
class Base
{
public:
virtual int func1();
virtual int func2()=0;
protected:
virtual void f1_specific_part1()=0;
virtual void f1_specific_part2()=0;
int n;
};
int Base::func1() { // common skeleton of the algorithm
...
f1_specific_part1();
...
f1_specific_part2();
...
}
class Der1: public Base
{
protected:
void f1_specific_part1() override; // Implements the specific variation
virtual void f1_specific_part2() override;
};
Вариант 2
Можно рассмотреть факторизацию общего кода производных классов в защищенный метод класса Base
.
Переопределение чисто виртуальной функции будет тогда просто вызывать защищенную базовую классную общую функцию (для der1
и der2
) или просто использовать их собственную реализацию, которая полностью отличается (для der3
и der4
).
class Base
{
public:
virtual int func1()=0;
virtual int func2()=0;
protected:
int common_part1_funct1(); // implements some common parts
int common_part2_funct1();
int n;
};
class Der1: public Base
{
...
int func1() override {
common_part1_funct1();
...
common_part2_funct1();
...
}
};
Вариант 3?
Важное замечание: В моем ответе предполагается, что между большинством производных классов много общего.Однако если у вас есть только небольшое подмножество производных классов, которые имеют некоторые общие черты, то ответ Evg будет более подходящим.