C 繼承定義及基類與派生類物件賦值轉換

2021-09-25 11:34:40 字數 2380 閱讀 2700

繼承機制是物件導向程式設計使**可以復用的最重要的手段,它允許程式設計師在保持原有類特性的基礎上進行擴充套件,增加功能,這樣產生新的類,稱派生類。繼承呈現了物件導向程式設計的層次結構,體現了由簡單到複雜的認知過程。以前我們接觸的復用都是函式復用,繼承是類設計層次的復用

具體定義格式如下

繼承關係與訪問限定符有

繼承方式:public繼承、protected繼承、private繼承

訪問限定符:public訪問、protected訪問、private訪問

繼承基類成員訪問方式的變化

類成員/繼承方式public繼承protected繼承private繼承

基類的public成員派生類的public成員

派生類的protected成員

派生類的private成員

基類的protected成員派生類的protected成員

派生類的protected成員

派生類的private成員

基類的private成員在派生類中不可見

在派生類中不可見

在派生類中不可見

如何驗證在不同繼承關係下基類成員的各型別成員訪問關係的變化?給乙個基類,使用不同的繼承方式給出乙個派生類,基類中不同訪問限定的成員在派生類類內與類外的訪問限定如何。

類內類外都可訪問則為派生類的public成員;類內可使用,但類外不可使用為派生類的protected成員,類內類外都不可訪問則為派生類的private成員。

//不同繼承關係下基類成員的各型別成員訪問關係的變化

#include#includeusing namespace std;

class preson

protected:

string _name;

private:

int _age;

};//class student : protected person

//class student : private person

class student :public preson

protected:

int _stunum;

};int main()

總結

基類private成員在派生類中無論以什麼方式繼承都是不可見的。這裡的不可見是指基類的私有成員還是被繼承到了派生類物件中,但從語法上限制派生類物件不管在類內還是類外都不能去訪問它

基類private成員在派生類中是不能被訪問,如果基類成員不想在類外直接被訪問,但需要在派生類中能訪問,就定義為protected。可以看出保護成員限定符是因為繼承才出現的

實際上面的**我們總結一下就會發現,基類的私有成員在派生類中都是不可見的。基類的其它成員在子類的訪問方式=min(成員在基類的訪問限定符,繼承方式),public>protected>private。

使用關鍵字class時預設的繼承方式是private,使用struct時預設的繼承方式是public,不過最好顯式的寫出繼承方式。

在實際運用中,一般使用的都是public繼承,幾乎很少使用protected/private繼承,也不提倡使用,因為protected/private繼承下來的成員都只能在派生類的類內使用,實際中擴充套件維護性不強。

派生類物件可以賦值給基類的物件/基類的指標/基類的引用。可以理解為把派生類中父類那部分切割下來賦值過去。

基類物件不能賦值給派生類物件。

基類的指標可以通過強制型別轉換賦值給派生類的指標,但是必須是基類的指標是指向派生類物件時才是安全的。這裡基類如果是多型型別,可以使用rtt(run-time type infomation)的dynamic cast來進行識別後進行安全轉換。

C 隨筆 類繼承 派生類與基類

1 派生類會繼承基類的資料成員和部分方法成員,並將其加入派生類的相應區域 public private protected,取決於才去的繼承方式 之所以是部分方法成員,是因為有一些特殊的函式不會被繼承 建構函式 析構函式 賦值運算子函式等。public private protected區域的劃分只...

關於基類指標 派生類指標 基類物件派 生類物件問題

1 基類指向派生類的指標 2 派生類指向基類的指標 3 以及將派生類指標強制轉換為基類指標 4 將基類指標強制轉換為派生類指標 無論是基類指向派生類還是派生類指向基類,重點就是哪個類的指標就呼叫哪個類的方法,而輸出的是指標指向的物件。基類指向派生類的指標即將派生類物件賦給基類指標,如果輸出的話,呼叫...

繼承 基類和派生類

說明派生類的生成和使用 include using namespace std class test1 基類 test1 int a x a void disp class test2 public test1 派生類 test2 int a,int b test1 a void disp intm...