跳至內容

C++/類

維基教科書,自由的教學讀本
< C++

可以用class或struct關鍵字為開頭定義類(class)。類可以有數據成員,也可以有函數成員。

訪問說明符(access specifier)有3種:public、private、protected。在類定義內部使用訪問說明符,其後的成員聲明(member-declaration)都具有相應的訪問屬性,直至向下遇到新的訪問說明符為止。

訪問說明符也可以用在派生類聲明的基類說明(base-specifier)時,指示繼承的基類的成員的訪問屬性,相應為:

  • 公開繼承(public inheritance):基類的公開成員、保護成員在派生類的訪問屬性不變;基類的私有成員不能被派生類訪問。
  • 保護繼承(protected inheritance):基類的公開成員、保護成員在派生類變為保護訪問屬性;基類的私有成員不能被派生類訪問。
  • 私有繼承(private inheritance):基類的公開成員、保護成員在派生類變為私有訪問屬性;基類的私有成員不能被派生類訪問。

也可參見下表:

Access specifiers in the base class
private protected public
private inheritance The member is inaccessible. The member is private. The member is private.
protected inheritance The member is inaccessible. The member is protected. The member is protected.
public inheritance The member is inaccessible. The member is protected. The member is public.

C++的面向對象編程,支持函數重載、函數覆蓋、名字隱藏:

  • 函數重載:在同一個作用域內,允許簽名(signature)不同的函數共存。函數簽名是由函數名字、形參的類型與順序這些信息構成。即允許函數名相同但形參類型或順序不同的函數共存。
  • 函數覆蓋:在虛函數機制下,派生類可以在虛表的槽(slot)中覆蓋簽名相同的基類的成員函數。
  • 名字隱藏(name hide):如果基類與派生類有同名(即使簽名不同)的成員函數,則該基類成員函數在派生類中不可見。即重載對於跨作用域是無效的。C++11以後可以用using base::memberFunc;這樣的代碼把基類成員函數提升為派生類的成員函數。名字隱藏的目的是避免改變基類實現可能影響到子類已經正常工作的代碼出現未預料的行為。