Сценарий наследования Diamond -отлично компилируется в G++, но выдает предупреждения/ошибки в VC++/Eclipse

У меня есть базовый класс «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");
    }
};

. Ключевое слово virtual в объявлении должно решить проблему алмазов.

Теперь я хотел бы объединить два класса в другой класс, чтобы были реализованы как 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'. При компиляции с помощью Visual StudioЯ получаю 2 предупреждения:

warning C4250: 'DerivedC' : inherits 'DerivedB::DerivedB::B' via dominance
warning C4250: 'DerivedC' : inherits 'DerivedA::DerivedA::A' via dominance

Итак, вопрос:каков правильный способ сделать это? Приведенный выше код вызывает неопределенное поведение?

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

14
задан Tibi 15 August 2012 в 08:07
поделиться