2010-12-11 12 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

相关问题