2012-04-14 144 views
1

我想不出在以下情况下会发生什么:C++多重继承

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

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

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

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

Base* b = new Bottom(); 

在D1和D2从MBASE几乎继承了钻石的原始定义,但这里只有一个。我们是否仍然在Bottom对象中有两个单独的子对象,因此最后一行不能编译,因为编译器不知道要使用哪个子对象?

+1

你*尝试了吗? – 2012-04-14 17:04:51

回答

2

这在C++ 03标准的第10.1.4节中有规定。虚拟和非虚拟基础是独立的,所以每个基础都会有一个。

这是很容易扩大你的例子来说明这一点:

class MBase { 
    public: 
     MBase(int arg) { cerr << "MBase::MBase(" << arg << ")\n"; } 
     virtual const char* vf() const = 0; 
     virtual ~MBase() {} 
}; 

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

class D2 : virtual public MBase { 
    public: 
     D2() 
     : MBase(2) // This doesn't get used in this example because 
        // it is the responsibility of the most-derived 
        // class to initialize a virtual base, and D2 isn't 
        // the most-derived class in this example. 
     { 
     } 
     const char* vf() const { return "D2"; } 
}; 

class Bottom : public D1, public D2 { 
    public: 
    Bottom() 
    : MBase(5) // D1 and D2 default constructors are called implicitly. 
    { 
    } 
    const char* vf() const { return "Bottom"; } 
}; 

int main(int argc,char **argv) 
{ 
    Bottom b; 
    return 0; 
} 

输出:

MBase::MBase(5) 
MBase::MBase(1) 
+0

为什么D2的构造函数从未被调用? – Bober02 2012-04-14 17:57:51

+0

@ Bober02:D2构造函数被调用,但D2不调用虚拟基类的构造函数,即使它看起来像它一样。我在答复中添加了一些解释。 – 2012-04-14 18:05:01

1

我觉得你的问题是与此类似的......基本上,每个客体都有自己的MBASE类的基本对象...

Diamond inheritance

雷加rds,Erwald