2011-01-05 93 views
4
#include<iostream> 

class base{ 
public: 
base(){std::cout<<"In base";} 
}; 

class dv1:virtual private base { 
public: 
dv1(){std::cout<<"In DV1";} 
}; 

class dv2:virtual private base { 
public: 
dv2(){std::cout<<"In DV2";} 
}; 

class drv : public dv1, public dv2 { 
public: 
drv() {std::cout<<"Why is this working";} 
}; 

int main() { 
drv obj; 

return 0; 
} 

是不是在虛擬繼承的情況下,大多數派生類的責任是調用構造函數? 注意:這裏的基地是虛擬和私人的繼承。誰在虛擬繼承中調用構造函數?

+0

的參數的構造函數,什麼是輸出與你期待?如果你期望有不同的東西,我建議你回頭再看看繼承章節,並試着首先理解它。 – Nim 2011-01-05 10:56:19

+0

我期待它不會編譯,因爲基礎是虛擬和私人派生的。 – Learner 2011-01-05 11:15:44

回答

5

你的drv構造函數沒有明確地調用基類(ES)的構造函數,所以編譯器會生成調用基類

+0

那是對的......但它怎麼能這樣做呢? – Learner 2011-01-05 11:13:26

+2

'base :: base()'是公共的,所以'drv'可以訪問這個構造函數。 「base」是「dv1」和「dv2」的私有基地這一事實並不相關。 – 2011-01-05 13:51:46