2013-06-19 103 views
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没有指定非静态数据memeber或基类(类似的错误对其他成员的工作)

我无法理解发生什么事情。难道我不能使用Initalizer列表或其他东西来初始化受保护的成员吗?

+0

什么是'vec'? –

+0

'vec'是我为矢量(x,y,z)定义的另一个类 – user1240679

+1

[派生构造函数中访问基本成员的问题]的可能重复(http://stackoverflow.com/questions/2947583/problem-accessing-base - 成员在派生构造函数) –

回答

3

难道我不能使用Initalizer列表或其他东西来初始化受保护的成员吗?

没错。只有类自己的成员可以在构造函数初始化列表中初始化(您可以,OTOH,在构造函数的主体中赋予它们)。基本子对象首先被初始化。

你需要工作在某种程度上委托给基类的构造函数:

class Base { 

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

class Derived : public Base { 
    explicit Derived(int i) : Base(i) 
    { } 
}; 
+0

'Explicit'的意思是? – user1240679

+0

它停止来自整数的隐式转换。否则,你可以写Base b = 42;请参阅http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean/121163#121163 – doctorlove

+0

它可以防止从int到Base的隐式转换,如下所示:'Base b = 1; //不会工作'但是这样做:'Base b = Base(1); //工作,它是显式的'这是一个很好的习惯,因为这个原因声明一个参数构造器是明确的。 – jrok

1

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

+0

由于成员受到保护,我认为可以这样做(使用派生类中的初始化器列表)。 – user1240679

相关问题