Question

Can I change this code to make it work? Is it possible to combine template method pattern and multiple inheritance? It seems to be very convenient to implement different algorithms in different classes. Thank you.

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
{};
Était-ce utile?

La solution

Fundamentally, your problem is that TFirstAlgorith::Do1 isn't related to TBase::Do1 (and likewise TSecondAlgorithm::Do2 to TBase::Do2.

One possible way to fix that would be to make them related:

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
{};

Autres conseils

You can use implementations for Do1 and Do2 and call appropriate algorithm inside them.

 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() ; }  
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top