Как совместить шаблон шаблонного метода и множественное наследование?
Могу ли я изменить этот код, чтобы он работал? Можно ли объединить шаблон шаблонного метода и множественное наследование? Кажется, очень удобно реализовывать разные алгоритмы в разных классах. Спасибо.
class TBase {
public:
virtual void Do1() const = 0;
virtual void Do2() const = 0;
void Do() const {
Do1();
Do2();
}
};
class TFirstAlgorithm {
public:
void Do1() const {}
};
class TSecondAlgorithm {
public:
void Do2() const {}
};
class TAlgorithm
: public TBase
, public TFirstAlgorithm
, public TSecondAlgorithm
{};
2 ответа
Решение
По сути, ваша проблема в том, что TFirstAlgorith::Do1
не связано с TBase::Do1
(и аналогично TSecondAlgorithm::Do2
в TBase::Do2
,
Один из возможных способов исправить это - связать их:
class TBase {
public:
virtual void Do1() const = 0;
virtual void Do2() const = 0;
void Do() const {
Do1();
Do2();
}
};
class TFirstAlgorithm : public virtual TBase {
public:
void Do1() const { }
};
class TSecondAlgorithm : public virtual TBase {
public:
void Do2() const { }
};
class TAlgorithm
: public TFirstAlgorithm
, public TSecondAlgorithm
{};
Вы можете использовать реализации для Do1 и Do2 и вызывать соответствующий алгоритм внутри них.
class TBase {
public:
virtual void Do1() const = 0;
virtual void Do2() const = 0;
void Do() const {
Do1();
Do2();
}
};
class TFirstAlgorithm {
public:
void Do1() const {}
};
class TSecondAlgorithm {
public:
void Do2() const {}
};
class TAlgorithm
: public TBase
, public TFirstAlgorithm
, public TSecondAlgorithm
{
virtual void Do1() const { TFirstAlgorithm::Do1() ; }
virtual void Do2() const { TSecondAlgorithm::Do2() ; }
};