Essentially, your problem is that TFirstAlgorith::Do1 does not apply to TBase::Do1 (and also from TSecondAlgorithm::Do2 to TBase::Do2 .
One possible way to fix this is to link them:
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 {};
source share