如何在派生类构造函数中初始化基类成员变量?

amr*_*san 107 c++ inheritance

为什么我不能这样做?

class A
{
public:
    int a, b;
};

class B : public A
{
    B() : A(), a(0), b(0)
    {
    }

};
Run Code Online (Sandbox Code Playgroud)

In *_*ico 123

你不能初始化abin,B因为他们不是.的成员B.他们是成员A,因此只能A初始化他们.您可以将它们公开,然后进行分配B,但这不是推荐的选项,因为它会破坏封装.相反,创建一个构造函数A以允许B(或任何子类A)初始化它们:

class A 
{
protected:
    A(int a, int b) : a(a), b(b) {} // Accessible to derived classes
    // Change "protected" to "public" to allow others to instantiate A.
private:
    int a, b; // Keep these variables private in A
};

class B : public A 
{
public:
    B() : A(0, 0) // Calls A's constructor, initializing a and b in A to 0.
    {
    } 
};
Run Code Online (Sandbox Code Playgroud)

  • 虽然你的例子是正确的,但你的解释是误导性的.这不是你不能*在`B :: B()中初始化*`a`和`b`,因为它们是私有的.你不能初始化它们,因为它们不是"B类"的成员.如果你把它们公开或保护你可以*在*B :: B()`的主体中分配它们. (30认同)
  • 此外,您的解决方案使A类非聚合,这可能很重要,因此必须提及. (2认同)

NPE*_*NPE 24

撇开事实,他们是private,因为ab是的成员A,他们是为了通过初始化A的构造函数,而不是由一些其他类的构造函数(衍生与否).

尝试:

class A
{
    int a, b;

protected: // or public:
    A(int a, int b): a(a), b(b) {}
};

class B : public A
{
    B() : A(0, 0) {}
};
Run Code Online (Sandbox Code Playgroud)


Vio*_*ffe 8

不知何故,没有人列出最简单的方法:

class A
{
public:
    int a, b;
};

class B : public A
{
    B()
    {
        a = 0;
        b = 0;
    }

};
Run Code Online (Sandbox Code Playgroud)

您不能访问初始化列表中的基成员,但是构造函数本身,就像任何其他成员方法一样,可以访问基类的publicprotected成员。

  • 在“class A”内部,我们不能依赖“a”和“b”的初始化。例如,“class C : public A”的任何实现都可能忘记调用“a=0;”并让“a”未初始化。 (3认同)
  • @SaileshD:如果您使用昂贵的构造函数初始化对象,则可能存在。当`B` 的实例被分配时,它首先会被默认初始化,然后它会在`B` 的构造函数中被赋值。但我也认为编译器仍然可以优化这一点。 (2认同)