2013-06-19 32 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

相關問題