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

时间:2014-06-06 10:34:41

标签: c++

我对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;
}

2 个答案:

答案 0 :(得分:4)

这是因为您无法在派生类中初始化基类成员。你叫什么"在构造函数内初始化"不是初始化,它是在成员已经被基类的构造函数初始化之后的赋值。

答案 1 :(得分:0)

当我们到达B的初始化列表(如果存在的基础构造函数调用之后的部分)时,

data已经被A&#39}的构造函数初始化了。你不能初始化两次。您可以告诉A&#39的构造函数如何初始化它,或者为已经初始化的成员分配其他内容。