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, мне нужно наследовать от обоих классов.
Надеюсь, я его достаточно описал и никого не смутил. Спасибо за помощь!