2013-01-04 77 views
-1

可能重复:
In C++, what is a virtual base class?虚拟关键字

在创建DR的对象时该代码时,字符串 “Hello World” 应当被印刷的4倍,而不是将其仅打印3次。 为什么如此? 从我认为这是因为mid1和mid2实际上是遗传的。 有人可以解释我什么时候发生,当我们几乎继承一个类,更重要的是,当它是有用的,为什么?

#include <iostream> 

struct BS 
{ 
    BS() 
    { 
    std::cout << "Hello World" << std::endl; 
    } 
    unsigned int color; 
}; 

struct mid1 : virtual public BS { }; 
struct mid2 : virtual public BS { }; 
struct mid3 : public BS { }; 
struct mid4 : public BS { }; 

struct DR : public mid1, public mid2, 
      public mid3, public mid4 { }; 

int main(int argc, char** argv) 
{ 
    DR d; 
    return 0; 
} 
+1

[请选择](https://www.google.com/search?q=virtual+inheritance) – chris

+1

您的意思是“”Hello World“应该打印3次,所以它是。”? –

+0

没有任何有限的知识,我把它计算为4.但它是印刷3.我想知道原因。 – jairaj

回答

7

让我们来看一个简单的例子:

class base {}; 

class mid1 : public base {}; 
class mid2 : public base {}; 

class derived1 : public mid1, public mid2; 

class mid1a : virtual public base {}; 
class mid2a : virtual public base {}; 

class derived2 : public mid1a, public mid2a {}; 

如果我们画这些对象图,我们可以得到这样的事情:

enter image description here

当中间类使用虚拟继承,派生类只包含基类的单个实例,而不是每个i的单独实例中级班。

在你的情况下,这会导致基类的三个实例,而不是四个。