2012-04-14 68 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