c ++ 1y是否允许从派生类中进行基类变量的类内初始化?

时间:2014-03-28 06:30:39

标签: c++ c++11 c++14

而不是:

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会支持这种或类似的语法吗?

2 个答案:

答案 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)

不,从不。

必须在基类的构造函数中初始化基类的所有字段。 只有基类中的构造函数知道如何初始化其字段。

您可以并且必须通过其构造函数初始化对象或其字段。