代替这个:
class base
{
protected:
base( int value )
: member{value}
{}
int member = 0;
};
class derived_1 : public base
{
public:
derived_1()
: base{ 1 }
{}
};
class derived_2 : public base
{
public:
derived_2()
: base{ 2 }
{}
};
这将很有用:
class base
{
protected:
int member = 0; // Default value
};
class derived_1 : public base
{
base::member = 1; // Instead of passing it to a base class constructor
};
class derived_2 : public base
{
base::member = 2;
};
c ++ 1y是否支持此语法或类似语法?
不,目前没有计划允许这样做。允许初始化程序绕过基类构造函数(如果有)似乎有些奇怪。允许基类说明符包含一个初始化程序似乎更有意义:
class derived_1 : public base = {1}
{
};
如果您可以解释该语言的益处(您有具体的用例吗?),则可以考虑提交提案。
解决方法是,您可以考虑使用类模板:
template<int I = 0>
class base { protected: int member = I; };
class derived_1: public base<1> {};
如果需要保留公共基类,请使用中间基类模板:
class base { protected: int member = 0; };
template<int I>
class base_init: public base { base_init() { base::member = I; } };
class derived_1: public base_init<1> {};
不确定是否相关,但是有关聚合和聚合初始化的规则在C ++ 14中可能会发生变化:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3653。 html
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句