2012-04-14 61 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"; } 
} 

如果我修改底部繼承修飾符是虛擬的兩個D1和D2什麼會改變?我的意思是,這會產生什麼影響:

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

回答

3

不,它不。每個類選擇哪個直接基類可以與其他類共享。由於Bottom是實現中的葉,它在兩種情況下都只有一個實例D1D2,它們在兩種情況下都只有一個這些類型的嵌套對象。由於D1拒絕共享MBase,因此Bottom也將嵌套兩個MBase對象。

但是MBase不是直接Bottom這兩個版本都可以訪問,因爲它是不明確的。您必須明確地投到D1D2才能訪問MBaseBottom對象(正因爲有兩個MBase s)。


的區別是,如果你有一個D1,幾乎從MBase繼承和一個不。

+0

好的,所以我猜如果我有幾個底部,都是從D1和D2實際繼承的,那麼葉子在它們中只有D1和D2的一個副本......非常感謝您的完美答案! – Bober02 2012-04-15 10:07:37