C++ C++;14初始化类构造函数初始化列表中的继承成员

C++ C++;14初始化类构造函数初始化列表中的继承成员,c++,c++11,c++14,C++,C++11,C++14,我有一个基础班 class A { protected: int a; }; 以及派生的类: class B : public A { B(int a_val) : a{a_val} // not allowed by compiler? { } }; 我可以通过以下方式解决问题: B(int a_val) { a = a_val; } 这是“解决方案”,还是我可以做我最初尝试做的事情 当然

我有一个基础班

class A
{
    protected:

    int a;
};
以及派生的类:

class B : public A
{

    B(int a_val)
        : a{a_val} // not allowed by compiler?
    {
    }
};
我可以通过以下方式解决问题:

    B(int a_val)
    {
        a = a_val;
    }
这是“解决方案”,还是我可以做我最初尝试做的事情

当然,我可以这样做:

    B(int a_val)
        : A(a_val)
    {
    }
并更改
A类

    A(int a_val)
        : a{a_val}
    {
    }
然而,就我所做的而言,这并不是真正的“更好”

在回答下面的一个问题时(斯旺):我能这样做吗

B(int a_val)
    : A(), a{a_val}
{
}
执行此操作时:

class B : public A
{

    B(int a_val)
        : a{a_val} // not allowed by compiler?
    {
    }
};
您正在尝试初始化一个不属于B类的变量,因此正确的解决方案是

B(int a_val)
   : A(a_val)
{
};
你可以这样做

B(int a_val)
{
    a = a_val;
};
因为在a=a_val之前,已调用a的默认构造,并且a::a已默认初始化。

执行此操作时:

class B : public A
{

    B(int a_val)
        : a{a_val} // not allowed by compiler?
    {
    }
};
您正在尝试初始化一个不属于B类的变量,因此正确的解决方案是

B(int a_val)
   : A(a_val)
{
};
你可以这样做

B(int a_val)
{
    a = a_val;
};

因为在a=a_val之前,已经调用了a的默认构造,并且a::a已经默认初始化。

@LogicStuff我看不出这是如何重复的myself@Mikhail链接问题非常相似,但不同的问题是我believe@LogicStuff我看不出这怎么是重复的myself@Mikhail这个问题很相似,,但是不同的问题我相信谢谢,在我上面的问题中看到我的问题(我已经附加了)不,你不能,因为a已经被a()初始化了,你正在尝试再次初始化它,通过执行a=a_val,你使用的是赋值运算符,而不是复制构造函数。谢谢,在我上面的问题中看到我的问题(我已经附加了)不,你不能,因为a已经被a()初始化,然后你尝试再次初始化它,通过执行a=a_val,你使用的是赋值运算符,而不是复制构造函数。