Как совместить шаблон шаблонного метода и множественное наследование?

Могу ли я изменить этот код, чтобы он работал? Можно ли объединить шаблон шаблонного метода и множественное наследование? Кажется, очень удобно реализовывать разные алгоритмы в разных классах. Спасибо.

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() ; }  
};
Другие вопросы по тегам