2

我正在整理我的 C++ 学习并尝试在这里编写一个程序。

class Quad{
public:
Quad(){}
protected:
vec _topLeft, _topRight, _bottomLeft, _bottomRight;
};

class IrregularQuad : public Quad{
public:
IrregularQuad(vec topLeft, vec topRight, vec bottomLeft, vec bottomRight)
: _topLeft(topLeft), _topRight(topRight), _bottomLeft(bottomLeft), _bottomRight(bottomRight)
{}
};

我在上面的 Dervied 类承包商上收到一个编译错误,说: 成员初始化程序 _topLeft 没有命名非静态数据成员或基类(其他成员也有类似错误)

我无法理解发生了什么。是我无法使用初始化列表或其他东西初始化受保护的成员吗?

4

3 回答 3

3

是我无法使用初始化列表或其他东西初始化受保护的成员吗?

正确的。只有类自己的成员才能在构造函数初始化器列表中初始化(您可以,OTOH,在构造函数的主体中分配给它们)。首先初始化基础子对象。

您需要以某种方式将工作委托给基类的构造函数之一:

class Base {

    explicit Base(int i) : m(i)
    {}
protected:
    int m;
};

class Derived : public Base {
    explicit Derived(int i) : Base(i)
    { }
};
于 2013-06-19T16:34:43.970 回答
1

您不会在派生类的初始化程序列表中初始化基类成员。您可以添加一个构造函数来Quad为您执行此操作,或者您可以自己在派生类构造函数的主体中设置它们。

于 2013-06-19T16:33:49.827 回答
0

这是错误 C2614 的副本:“ChildClass”:非法成员初始化:“var1”不是基础或成员

您只能在初始化列表中初始化成员或基类。

于 2013-06-19T16:34:58.283 回答