在派生类成员初始化列表中初始化基类数据成员时出现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;
}

这是因为不能在派生类中初始化基类成员。你所说的"构造函数内部的初始化"不是初始化,它是在基类的构造函数已经初始化成员之后的赋值。

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

最新更新