为什么所有现有的C ++编译器都不支持继承构造函数?

时间:2010-12-11 16:58:10

标签: c++ constructor inheritance

目前,G ++和VC ++ 2010都不支持继承构造函数。

但是,我认为这是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)

5 个答案:

答案 0 :(得分:6)

在C ++ 0x中有很多新材料,似乎在gcc上工作的志愿者发现其他变化更有趣,最先工作。

对于VC ++,不仅要确定工作的优先级,还要考虑需求,文档和非常广泛的测试的额外成本(通常在Microsoft产品经理博客上提到),这些是上面出售的产品的必要部分。而且只是让它发挥作用。

最后,it sounds like there was recent discussion among the C++0x committee about cutting this feature,因为95%的用例都有简单的解决方法。

综合起来,我并不感到惊讶,编译器工程师正在为以后保存这个。

答案 1 :(得分:2)

我认为你不会找到一个特定的理由来让他们不再使用这个功能。一般原则是,C ++ 0x中还有许多其他内容,编译人员通常比语言功能更渴望实现库功能,特别是当标准尚未完成且语言功能可能发生变化时。

答案 2 :(得分:2)

  1. C ++ 0x还不是标准。
  2. 他们没有足够的时间来实施它。
  3. 这并不像你想象的那么简单。仅仅调用这些构造函数是不够的。编译器需要在派生类中生成适当的构造函数,以初始化派生类的成员。

答案 3 :(得分:1)

这是2012年3月,但仍然没有编制者支持这一点。

可变参数模板构造函数可以很好地包装基类构造函数,并允许您覆盖某些ctors来启动。这可能不适用于您的多重继承示例。

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

答案 4 :(得分:0)

编译器只会实现特定语言版本的功能。如果编译器说要支持C ++ 0x并且不支持它的所有功能,那么它就是编译器的错误,使用更好的编译器。

我不认为C ++ 0x是在你提到的编译器中实现的。