2010-12-11 7 views
4

今のところ、G ++とVC++ 2010の両方は継承コンストラクタをサポートしていません。継承コンストラクタは、既存のすべてのC++コンパイラでサポートされていないのはなぜですか?

しかし、これはC++ 0xの中で最も美しいものだと思います。コンパイラで実装するのはむしろ簡単だと思います。

なぜこの機能はコンパイラには興味がありませんか?

は、私はこのようなのstd ::文字列を継承して自分自身の文字列クラスを設計したいと仮定します

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

+0

@UncleBens、私はそれがデフォルトで初期化されているか、または初期化されていないはずだと思います。 – xmllmx

+0

'std :: string'は派生するものではありません(または他のSTLコンテナから派生するものではありません)。 – fredoverflow

答えて

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標準はまだ完成していません。彼らは徐々に展開されています。 –

2

私はあなたがまだこの機能を選択していない特定の根拠を見つけるつもりはないと思います。一般的な原則は、C++ 0xには他にも多くのことがあります。一般に、コンパイラの方は、言語の機能よりもライブラリ機能を実装する方がはるかに熱心です。

+1

逆に、言語サポートが存在するまではライブラリの変更*の多くは実行できません。また、言語機能が変更されるとライブラリも変更する必要があります。 –

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

Duh、Benの答えはすでにこのソリューションにリンクしています。冗長性に対する謝罪 – goertzenator

関連する問題