1. 程式人生 > >C++ 類的繼承——繼承的基礎

C++ 類的繼承——繼承的基礎

          繼承意味著可以為一個類定義並編譯一個非常泛化的形式。C++最強大的特性之一就是可通過繼承,從一個類派生出另一個類。繼承是根據一個類(稱為基類)建立一個新類(稱為派生類)的過程。派生類自動具有基類的所有成員變數和函式,並可根據需要新增更多的成員函式和成員變數。 派生類    派生類的定義和類的定義類似,只是在類定義的第一行添加了一個冒號、保留字public和基類的名稱,例如: class HourlyEmployee :public Employee {}; 表示定義一個類HourlyEmployee,該類是Employee的繼承類。派生類自動繼承基類所有的成員變數和函式,在派生類中,只給出了新增成員變數和成員函式。 派生類中的建構函式  基類中的建構函式不由派生類繼承,但是可以在派生類建構函式的定義中呼叫基類的建構函式。派生類建構函式可以首先呼叫基類建構函式,初始化從基類中繼承的資料,使用一種特殊的語法呼叫基類的建構函式,例如: HourlyEmployee
::HourlyEmployee(string the_name , string the_number , double the_wage_rate,double the_hours )               : Employee( the_name, the_number), wage_rate(the_wage_rate ), hours(the_hours){} ::後面的部分即為建構函式,其中,Employee( the_name, the_number)是對基類建構函式的呼叫,呼叫基類雙參賽建構函式,傳遞the_name, the_number的值。 HourlyEmployee的另一個建構函式是: HourlyEmployee
::HourlyEmployee() :Employee (), wage_rate(), hours(0) {} Employee ()表示呼叫基類無引數的建構函式。在派生類建構函式的初始化區域,應該堅持包括對其中一個基類建構函式的呼叫。如果派生類的建構函式定義不包括對基類建構函式的呼叫,就會自動呼叫基類建構函式的預設(無引數)版本,假如基類沒有預設的建構函式,就會出錯。所有,在HourlyEmployee類的預設建構函式定義中,省略Employee (),即 HourlyEmployee::HourlyEmployee() : wage_rate(), hours(0) {}  與上述建構函式效果相同。 派生類繼承過程中的私有成員變數
 派生類不能直接訪問基類中的私有成員變數,必須使用基類中定義的公共取值和賦值成員函式。取值函式是允許訪問一個類的成員變數的函式,而賦值函式是允許更改一個類的成員變數的函式。除非是在基類的介面中實現,否則不能直接訪問私有成員變數或者成員函式——即使是在派生類的一個成員函式的定義中。私有成員函式根本不會繼承。 protected限定符  不能在派生類的定義或實現中訪問一個私有成員變數或者私有成員函式。但是,還有另一種成員變數和成員函式,可以(而且只能)在派生類中根據名稱直接訪問。在不是拍攝類的其他任何類總,則不能訪問這種成員。在一個類誒的成員變數或者成員函式之前,如果新增限定符protected,那麼對於除派生類植物的任何類或者函式來說,它的效果等同於用private來標記的成員,但在派生類中,可以根據名稱來訪問這些成員。 重定義成員函式  定義派生類時,只需要明確列出需要修改定義的那些繼承成員函式的宣告。派生類繼承基類的所有成員函式和成員變數,但是如果一個派生類需要以不同的方式來實現一個繼承的成員函式,就可以在派生類中重新定義這個函式。要重定義一個函式,必須在派生類的定義中列出它的宣告。 重定義與過載的比較  重定義函式時,派生類中給出的新函式定義具有相同的引數數量和型別。如果派生類中的函式使用了數量不同的引數,或者某個引數具有不同的型別,那麼派生類中實際會擁有兩個函式,這正是函式過載的概念,不能說是重定義。 訪問重定義的基函式  函式在派生類中重定義後,如果要在派生類中呼叫重定義的函式,需要使用域解析操作符,並指定基類的名稱。例如,定義一個HourlyEmployee類的物件,HourlyEmployee  sally_h,而要呼叫基類Employee的print_check() 函式,那麼呼叫方式為: sally_h.Employee::print_check() 函式的簽名 是指函式名以及引數列表中的型別序列,但是不包括關鍵字const和符合&。以這個簽名的定義為準,過載一個函式名稱時,函式名稱的兩個定義必須具有不同的簽名。在派生類中,如果一個函式與基類中的函式同名,但是具有不同的簽名,那麼就是函式的過載而不是重定義。