У меня есть базовый класс Base, который является чистым виртуальным классом:
class Base {
public:
virtual void A() = 0;
virtual void B() = 0;
virtual ~Base() { } // Eclipse complains that a class with virtual members must have virtual destructor
};
У меня также есть 2 других класса, один из которых реализует A(), а другой реализует B():
class DerivedA : public virtual Base
{
public:
virtual void A() {
printf("Hello from A");
}
};
class DerivedB : public virtual Base
{
public:
virtual void B() {
printf("Hello from B");
}
};
Виртуальное ключевое слово в декларации должно решить проблему с алмазом.
Теперь я хотел бы объединить два класса в другой класс, чтобы реализовать как A(), так и B():
class DerivedC: public DerivedA, public DerivedB {
// Now DerivedA and DerivedB are combined
};
// Somewhere else in the code
DerivedC c;
c.A();
c.B();
Проблема:
Хотя g++ компилирует код просто отлично, Eclipse дает ошибку: The type 'DerivedC' must implement the inherited pure virtual method 'Base::B'
.
При компиляции с визуальной студией я получаю 2 предупреждения:
warning C4250: 'DerivedC' : inherits 'DerivedB::DerivedB::B' via dominance
warning C4250: 'DerivedC' : inherits 'DerivedA::DerivedA::A' via dominance
Итак, вопрос:, как правильно это сделать? Вызывает ли код выше поведение undefined?
Примечание: Название может быть немного вводить в заблуждение, я не знаю, какой хороший заголовок для этого вопроса будет.