2012-04-14 12 views
0

Im gemeinsamen Diamant Szenario:Mehrfachvererbung - virtual

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"; } 
} 

Was würde sich ändern, wenn ich die Erbschaft Modifikator von unten modifiziert für beide D1 und D2 virtuell zu sein? Ich meine, würde das irgendeine Auswirkung haben:

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

Antwort

3

Nein, tut es nicht. Jede Klasse wählt aus, welche ihrer direkten Basisklassen mit anderen geteilt werden. Da Bottom ein Blatt in Ihrer Implementierung ist und es in beiden Fällen nur eine Instanz von D1 und D2 hat, wird es in beiden Fällen genau ein verschachteltes Objekt dieser Typen haben. Da sich D1 weigert, eine MBase zu teilen, werden Bottom zwei MBase Objekte darin verschachtelt haben.

Jedoch ist MBase nicht direkt zugänglich von beiden Versionen von Bottom da es mehrdeutig ist. Sie müssten explizit auf D1 oder D2 umwandeln, um MBase über Bottom Objekte zugreifen (genau, weil es zwei MBase s).


Der Unterschied wäre, wenn Sie eine D1 hatte, die praktisch erbt von MBase und eine, die nicht der Fall ist.

+0

OK, also ich denke, wenn ich ein paar Bottoms hätte, alle praktisch von D1 und D2 erben, dann hätte das Blatt nur eine Kopie von D1 und D2 in allen ... Vielen Dank für eine perfekte Antwort! – Bober02