2011-03-10 55 views
1

我相信受保護的成員可以通過繼承類來訪問。那麼,我認爲這是好的,在思考過程中我的錯誤是什麼?關於繼承保護成員的問題

我有一些課程,食品和蔬菜,Veg從食品中繼承。食物有一個受保護的會員年齡;在Veg的構造函數中,我嘗試將age初始化爲0.爲什麼這是無效的?

一些代碼...

Veg::Veg():age(0) 
{ 
    cout << "Veg constructor." << endl; 
} 

class Veg : public Food 
{ 
//snip 
}; 

class Food 
{ 
//snip 
protected: 
    int age; 
}; 
+1

聲音有效。我們可以看到一些代碼嗎? – 2011-03-10 04:12:54

+0

你公開繼承嗎? – 2011-03-10 04:14:44

+0

是的,我正在公開繼承 – cellh 2011-03-10 04:15:01

回答

7

在爲一類C構造函數初始化列表中,您只能初始化C

  1. 直接基類,
  2. 虛基類別C
  3. 類別的非靜態數據成員C

如果要初始化基類的數據成員,則需要在基類的構造函數的初始化列表中或派生類的構造函數的主體中執行此操作。您不能在派生類的構造函數的初始化列表中執行此操作。

+0

非常有趣!爲什麼是這樣?爲什麼在初始化列表中聲明是非法的? – cellh 2011-03-10 04:20:15

+2

@ cellh:因爲基類數據成員被初始化爲基類構造函數執行的一部分。一個對象只能被初始化一次。 – 2011-03-10 04:21:57

+1

@cellh,只需在Food中添加另一個構造函數即可食物(int n):年齡(n){; }然後你可以用Veggie()初始化Veggie:Food(2){;} – 2011-03-10 04:24:24

2

這就是初始化列表的設計方式;在這種情況下聲明成員負責初始化的類。

通常,這是由食品暴露年齡克服,因爲在構造函數中的參數:

Food::Food(const int& inAge) : age(inAge) {} 
Veg::Veg() : Food(-1) {} 

雖然,你仍然可以訪問年齡在構造函數的身體,如果保護:

Veg::Veg() : Food() {this->age = -1;} 

如果它不是這樣,那麼你會構建兩次年齡,這通常在年齡類型比一個整數更復雜時更爲重要。