而不是:
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会支持这种或类似的语法吗?
答案 0 :(得分:7)
不,目前没有计划允许这样做。允许初始化程序绕过基类构造函数(如果有的话)似乎有点奇怪;允许基类说明符包含初始化器似乎更有意义:
class derived_1 : public base = {1}
{
};
您可以考虑submitting a proposal,如果您可以解释该语言将如何受益(您是否有具体的用例?)。
作为解决方法,您可以考虑使用类模板:
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
答案 1 :(得分:0)
不,从不。
必须在基类的构造函数中初始化基类的所有字段。 只有基类中的构造函数知道如何初始化其字段。
您可以并且必须通过其构造函数初始化对象或其字段。