代码之家  ›  专栏  ›  技术社区  ›  Haspemulator

C++:继承字段的初始化

  •  20
  • Haspemulator  · 技术社区  · 14 年前

    我有一个关于在派生类的构造函数中初始化继承成员的问题。示例代码:

    class A
        {
    public:
        int m_int;
        };
    
    class B: public A
        {
    public:
        B():m_int(0){}
        };
    

    此代码提供以下输出:

    In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'

    (见 http://codepad.org/tn1weFFP )

    我猜这是为什么? m_int 应该是的成员 B 和父类 A 在初始化时应该已经初始化 MIN 在里面 发生(因为父构造函数在继承类的成员初始化之前运行)。我的推理哪里出错?这段代码中到底发生了什么?

    EDIT :我知道初始化此成员的其他可能性(基本构造函数或派生构造函数中的赋值),但我想了解为什么我尝试它的方式是非法的?一些具体的C++语言特点还是这样的?如果可能的话,请给我一个C++标准的段落。

    4 回复  |  直到 8 年前
        1
  •  20
  •   Ben Jackson    14 年前

    您需要为a(它可以被保护,所以只有b可以调用它)创建一个构造函数,它会像您所拥有的那样初始化m\u int,然后调用 :A(0) 你在哪里 :m_int(0)

    你也可以设定 m_int = 0 在B的构造函数的主体中。它是可访问的(如您所描述的),它在特殊的构造函数语法中不可用。

        2
  •  4
  •   Niki Yoshiuchi    14 年前

    为了构造类的实例 B 首先实例化类的实例 A . 在这个例子中 m_int 初始化。在那次初始化之后 b 调用了的构造函数,因此无法重新初始化 MIN . 如果这是您的目标,那么您可以实现 这需要一个int,然后调用它 的初始化列表:

    class A
    {
    public:
      A(int x): m_int(x) {}
      int m_int;
    };
    
    class B: public A
    {
    public:
      B(): A(2) {}
    };
    
        3
  •  4
  •   wheaties    14 年前

    你想要的是:

    class A{
    public:
        A() : m_int(0);
        int m_int;
    };
    

    以便 m_int 在正确的位置初始化。

    编辑:

    从上面的注释中,编译器在尝试初始化 MIN 变量在 B 是否已由的构造函数初始化 A . 也就是说,不能重新初始化某些内容,只能重新分配。所以,您可以像上面提到的本·杰克逊那样重新分配,或者在适当的位置初始化。

        4
  •  0
  •   jai srivastava    8 年前

    在中生成构造函数 使用b():a(2) b()指令:m_int(0) 它的工作。