2015-10-06 160 views
5

虛基類是在最派生類初始化,所以我的猜測是,繼承了基類的構造函數應該工作以及:繼承虛基類的構造函數

struct base { 
    base(int) {} 
}; 

struct derived: virtual base { 
    using base::base; 
}; 

derived d(0); 

然而,這無法編譯與GCC 5.2.0,它試圖找到base::base(),但與鏗鏘3.6.2正常工作。這是GCC中的錯誤嗎?

+3

相關:http://stackoverflow.com/questions/2126522/c-virtual-inheritance – SingerOfTheFall

回答

5

這是gcc的bug 58751[C++ 11]繼承構造不虛繼承正常工作」 (又名:63339使用構造」 從虛擬基地被隱式刪除「):

從58751描述:

在文檔N2540它指出:

通常,繼承具有虛擬基類的類的構造函數定義將不合格,除非虛擬基礎支持默認初始化,或者虛擬基礎是直接基礎,並將其命名爲基礎轉發。同樣,所有數據成員和其他直接基礎都必須支持默認初始化,否則任何使用繼承構造函數的嘗試都將不合格。注意:使用時不合格,未聲明。

因此,虛擬基地的情況是由委員會明確考慮,因此應該實施。

解決方法從bug報告借來的:

struct base { 
    base() = default; // <--- add this 
    base(int) {} 
}; 

根據bug報告,在此情況下,構造base::base(int)被隱式生成的構造derived::derived(int)調用。

我檢查了your code沒有編譯。但this確實和它調用base::base(int)構造函數。

+0

當然,如果'base'不能被默認構造的話,這仍然不起作用......所以看起來,唯一的辦法圍繞這是手動重新定義所有派生類中的構造函數。 –