C ++ множественное наследование с базовыми классами, производными от одного и того же класса

Я наткнулся на проблему при попытке повторно использовать код из разных классов. Я публикую это здесь в надежде, что некоторые из вас смогут мне помочь.

У меня есть набор классов (B, C), происходящих из того же класса (A), который вызывает реализацию некоторых методов (foo, run). Класс B реализует этот метод, а B и C предоставляют другие методы:

#include<iostream>

template<class I, class O>
class A {
public:
    A() {}
    virtual ~A() {}

    virtual void foo() const = 0;     // force implementation of this function
    virtual void run() const = 0;     // force implementation of this function
};

template<class I, class O>
class B : public A<I,O> {
public:
    B() {}
    virtual ~B() {}

    virtual void foo() const {        // implementation for the Base class
        std::cout << "B's implementation of foo" << std::endl;
    }

    virtual void run() const {        // implementation for the Base class
        std::cout << "B's implementation of run" << std::endl;
    }

    virtual void foobar() const {     // some other function provided by this class
        std::cout << "B's implementation of foobar" << std::endl;
    }
};

template<class I, class O, class M>
class C : public A<I,O> {
public:
    C() {}
    virtual ~C() {}

    virtual void bar(M m) const {     // some other function provided by this class
        std::cout << "C's implementation of bar with: " << m << std::endl;
    }
};

Теперь я пытаюсь наследовать от B и C, чтобы у меня были дополнительные методы (foobar, bar), но также не нужно было реализовывать метод из класса A (foo), потому что он уже определен в B :

template<class I, class O>
class D : public B<I,O>, public C<I,O,int> {
public:
    D() {}

    void run() const {
        this->bar(123);
        this->foo();
        this->foobar();
    }
};

Но по какой-то причине компилятор выдает мне эту ошибку:

test.cpp: в функции int main (int, char **) ’: test.cpp: 68: 35: ошибка: невозможно выделить объект абстрактного типа‘ D <float, double> ’

A <float, double> * d = new D <float, double> (); // что я должен сделать

test.cpp: 48: 11: примечание: потому что следующие виртуальные функции являются чистыми в «D <float, double>»:

класс D: общедоступный B <I, O>, общедоступный C <I, O, int> {

    ^

test.cpp: 9: 22: примечание: void A <I, O> :: foo () const [with I = float; O = двойной]

виртуальный void foo () const = 0; // принудительная реализация этой функции

Вот код, который я использую для его запуска:

int main(int argc, char **argv)
{

    A<float, double> *b = new B<float, double>();
    b->foo();                                            // prints "B's implementation of foo"
    b->run();                                            // prints "B's implementation of run"

    //A<float, double> *c = new C<float, double, int>(); // obviously fails because C does not implement any of A's functions

    //A<float, double> *d = new D<float, double>;        // line 68: what I need to do
    //d->run();                                          // ***throws the abstract class error

    return 0;
}

Я хочу использовать функцию 'run' объекта класса D из указателя на A. Поскольку все функции являются виртуальными, я ожидаю выполнить реализацию каждой функции, определенной в самой низкой точке наследования, что означает, что 'B :: run 'будет отброшен. Поскольку 'D :: run' использует функции из B и C, мне нужно наследовать от обоих классов.

Надеюсь, я его достаточно описал и никого не смутил. Спасибо за помощь!

Ответы на вопрос(3)

Ваш ответ на вопрос