Мне было интересно, существует ли общий способ / шаблон, позволяющий производному классу иметь несколько более специализированную версию чисто виртуального метода в данном базовом классе.
class Base {
public:
Base() = default;
virtual ~Base() = 0;
virtual void foo(int bar) = 0;
};
inline Base::~Base() {}
class Derived public Base {
public:
Derived() = default;
~Derived() = default;
void foo(int bar) override {/*...*/}
};
class SpecializedDerived : public Base {
public:
SpecializedDerived() = default;
~SpecializedDerived() = default;
void foo(int bar, double additionalParameter) override {/*...*/}
};
Переопределение в классе SpecializedDerived
невозможно, поскольку сигнатура метода не соответствует сигнатуре в чисто виртуальном классе Base
.
Теперь, есть ли способ достичь описанного дизайна? Есть ли способ реализовать «более специализированные методы», поскольку существует наследование классов, которое позволит вам реализовать «более специализированные классы»?
При наборе текста я считал, что мое желание больше похоже на "Чувак, я просто хочу, чтобы вы предоставили какую-то функцию iterate(.)
!" вещь.
Единственная идея, которая пришла мне в голову до сих пор, это что-то вроде
class Base {
public:
Base() = default;
virtual ~Base() = 0;
virtual void foo(int bar) = 0;
};
inline Base::~Base() {}
class SpecializedDerived : public Base {
public:
SpecializedDerived(double addParam) : additionalParam_(addParam) {}
~SpecializedDerived() = default;
void foo(int bar) override {
iterate(bar, additionalParam_);
return;
}
private:
double additionalParam_;
void foo(int bar, double additionalParam) {/*...*/}
};
Где этот внутренний вызов функции фактически избыточен, как вы могли бы просто сделать:
class SpecializedDerived : public Base {
public:
SpecializedDerived(double addParam) : additionalParam_(addParam) {}
~SpecializedDerived() = default;
void foo(int bar) override {/* code using additionalPara_ */}
private:
double additionalParam_;
};