2013-01-04 118 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的單獨實例中級班。

在你的情況下,這會導致基類的三個實例,而不是四個。