繁体   English   中英

在派生类成员初始化列表中初始化基类数据成员时发生C ++错误

[英]C++ error initializing base class data member in the derived class member initialization list

我对C ++行为有个琐碎的问题。 当我尝试使用派生类的构造函数初始化列表初始化基类的数据成员时,出现错误。 但是,如果我在派生类构造函数内部进行初始化,或者用派生类成员初始化列表中的参数调用基类构造函数,则不会出错。 所以问题是为什么在第三种情况下我会出错。

class A {
protected:
   int data;
public:
   A(int i = 0) : data(i) {}
};
class B : public A {
public:
   B(int i = 0) { data = i; } /* works fine, initializing inside c'tor definition */
   B(int i = 0) : A(i) {} /* calling super class constructor with arg works fine */
   B(int i = 0) : data(i) {} /* error: class B does not have any field named data */
};
int main() {
    B obj1(7);
    B* obj2 = new B(8);    
    A* obj3 = new B(9);
    delete obj2; 
    delete obj3;
}

之所以如此,是因为您无法在派生类中初始化基类成员。 您所谓的“构造函数内部的初始化”不是初始化,它是在成员已由基类的构造函数初始化之后的赋值。

当我们到达B的初始化列表时, data已经由A的构造函数初始化(如果存在,则在基本构造函数调用之后的部分)。 您不能初始化两次。 您可以告诉A的构造函数如何对其进行初始化,也可以为已初始化的成员分配其他内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM