2010-12-11 62 views
4

現在,G ++和VC++ 2010都不支持繼承構造函數。爲什麼繼承構造函數不被所有現有的C++編譯器支持?

不過,我認爲這是C++ 0x中最漂亮的功能之一。我認爲編譯器應該很容易實現。

爲什麼編譯器對此功能不感興趣?

假設我想通過繼承的std :: string這樣的設計我自己的字符串類:

class MyString : public std::string 
{ 
public: 
// I have to redefine many overloaded ctors here and forward their arguments to 
// std::string's ctors. How tedious it will be!!! 
}; 

一個美麗的代碼示例:

struct B1 
{ 
    B1(char); 
}; 

struct B2 
{ 
    B2(double); 
    B2(int); 
}; 

struct D1 : B1, B2 
{ 
    using B1::B1; // D1(char) 
    using B2::B2; // D1(double), D1(int) 
}; 

D1 d('c'); //OK, invokes D1(char) 
+0

「漂亮的代碼示例」的問題:D1的B2部分如何初始化? – UncleBens 2010-12-11 17:17:13

+0

@UncleBens,我認爲它應該被默認初始化或者沒有初始化。 – xmllmx 2010-12-11 17:19:23

+0

'std :: string'並不意味着從(或任何其他STL容器)派生而來。 – fredoverflow 2010-12-11 17:19:44

回答

6

在C++ 0x中有很多新的材料,而且看起來工作在gcc的志願者發現其他變化更有趣,首先工作。對於VC++來說,不僅需要優先考慮工作,還需要額外的成本(通常在微軟產品經理的博客中提到)需求,文檔和非常廣泛的測試,這些都是銷售產品的必要部分,超越只是讓它工作。

最後,it sounds like there was recent discussion among the C++0x committee about cutting this feature,因爲類似95%的用例有簡單的解決方法。

結合起來,我並不感到驚訝的是,編譯器工程師們在以後保存這個。

0

編譯器將僅實現的功能特定語言版本。如果編譯器說支持C++ 0x並且不支持其所有功能,那麼這是編譯器的錯誤,請使用更好的編譯器。

我不認爲在您提到的編譯器中實現了C++ 0x。

+1

截至目前,還沒有編譯器能夠合理地實現整個C++ 0x功能集。此外,C++ 0x標準還沒有最終確定。他們正在逐步推出。 – 2010-12-11 17:08:00

2

我不認爲你會找到一個具體的理由爲他們沒有采取這項功能呢。總的原則是,C++ 0x還有很多其他的東西,編譯器人員通常比語言的特性更加渴望實現庫特性,特別是當標準尚未完成並且語言特性可能改變時。

+1

相反,在語言支持出現之前,許多庫變化*都無法完成(如果語言功能發生變化,庫也必須更改)。 – 2010-12-11 17:37:19

2
  1. C++ 0x不是標準。
  2. 他們沒有足夠的時間去實現它。
  3. 這不像你想象的那麼簡單。僅僅調用這些構造函數是不夠的。編譯器需要在派生類中生成適當的構造函數,以便初始化派生類的成員。
0

這是2012年3月,仍然沒有編譯器支持這一點。

可變模板構造函數可以很好地包裝基類構造函數,並且可以讓您覆蓋某些啓動類。這可能對您的多繼承示例不適用。

class MyString: public std::string 
{ 
public: 
    template<class ...Args> 
    MyString(Args... args): std::string(args...){} 
}; 
+0

杜,本的答案已經鏈接到這個解決方案。道歉爲冗餘。 – goertzenator 2012-03-20 15:21:30