2012-04-14 2 views
0

В общем случае алмаза:множественное наследование - виртуальный модификатор

class MBase { 
    public: 
    MBase(int) {} 
    virtual char const* vf() const = 0; 
    virtual ~MBase() {} 
}; 

class D1 : public MBase { //NOT VIRTUAL!!! 
    public: 
    D1() : MBase(1) {} 
    char const* vf() const { return "D1"; } 
}; 

class D2 : virtual public MBase { 
    public: 
    D2() : MBase(2) {} 
    char const* vf() const { return "D2"; } 
}; 

class Bottom : public D1, public D2 { 
    public: 
    char const* vf() const { return "Bottom"; } 
} 

Что изменится, если я изменил модификатор наследования Bottom быть виртуальным и для D1 и D2? Я имею в виду, что это повлияет:

class Bottom : public virtual D1, public virtual D2 { 
    public: 
    char const* vf() const { return "Bottom"; } 
} 

ответ

3

Нет, это не так. Каждый класс выбирает, какие из его основных базовых классов могут делиться с другими. Поскольку Bottom является листом в вашей реализации, и он имеет в обоих случаях только один экземпляр D1 и D2, он будет в обоих случаях иметь ровно один вложенный объект этих типов. С D1 отказывается делиться MBase, Bottom будет иметь два объекта MBase, вложенных в него.

Однако MBase не непосредственно доступны с обеих версий Bottom, так как он является неоднозначным. Вам нужно будет явно указать D1 или D2, чтобы получить доступ к объектам через Bottom (именно потому, что есть два MBase s).


Разница будет, если у вас один D1, что фактически наследует от MBase и тот, который не делает.

+0

ОК, так что я думаю, если бы у меня была пара Bottoms, все унаследовали практически от D1 и D2, тогда у листа будет только одна копия D1 и D2 во всех них ... Большое спасибо за отличный ответ! – Bober02

Смежные вопросы