虛基類是在最派生類初始化,所以我的猜測是,繼承了基類的構造函數應該工作以及:繼承虛基類的構造函數
struct base {
base(int) {}
};
struct derived: virtual base {
using base::base;
};
derived d(0);
然而,這無法編譯與GCC 5.2.0,它試圖找到base::base()
,但與鏗鏘3.6.2正常工作。這是GCC中的錯誤嗎?
虛基類是在最派生類初始化,所以我的猜測是,繼承了基類的構造函數應該工作以及:繼承虛基類的構造函數
struct base {
base(int) {}
};
struct derived: virtual base {
using base::base;
};
derived d(0);
然而,這無法編譯與GCC 5.2.0,它試圖找到base::base()
,但與鏗鏘3.6.2正常工作。這是GCC中的錯誤嗎?
這是gcc的bug 58751 「[C++ 11]繼承構造不虛繼承正常工作」 (又名:63339 「使用構造」 從虛擬基地被隱式刪除「):
從58751描述:
在文檔N2540它指出:
通常,繼承具有虛擬基類的類的構造函數定義將不合格,除非虛擬基礎支持默認初始化,或者虛擬基礎是直接基礎,並將其命名爲基礎轉發。同樣,所有數據成員和其他直接基礎都必須支持默認初始化,否則任何使用繼承構造函數的嘗試都將不合格。注意:使用時不合格,未聲明。
因此,虛擬基地的情況是由委員會明確考慮,因此應該實施。
解決方法從bug報告借來的:
struct base {
base() = default; // <--- add this
base(int) {}
};
根據bug報告,在此情況下,構造base::base(int)
被隱式生成的構造derived::derived(int)
調用。
當然,如果'base'不能被默認構造的話,這仍然不起作用......所以看起來,唯一的辦法圍繞這是手動重新定義所有派生類中的構造函數。 –
相關:http://stackoverflow.com/questions/2126522/c-virtual-inheritance – SingerOfTheFall