目前,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)
答案 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)
答案 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是在你提到的编译器中实现的。