🎬 博客主頁:博主鏈接
🎥 本文由 M malloc 原創,首發于 CSDN🙉
🎄 學習專欄推薦:LeetCode刷題集 數據庫專欄 初階數據結構
🏅 歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
📆 未來很長,值得我們全力奔赴更美好的生活?
文章目錄
- 😇本章詳情
- 😇繼承的前情介紹
- 📝繼承的概念(inheritance)
- 📝繼承出現前后發生的變化
- 😇繼承定義
- 📝定義格式
- ?基類和派生類間的轉換
- 📋切片或切割
- 📃如何鞏固學習
- 📃本文小結
😇本章詳情
🐤本篇文章將講授C++的繼承相關的知識
😇繼承的前情介紹
📝繼承的概念(inheritance)
😁繼承(inheritance)機制是?向對象程序設計使代碼可以復?的最重要的?段,它允許我們在保持原有類特性的基礎上進?擴展,增加?法(成員函數)和屬性(成員變量),這樣產?新的類,稱派?類。繼承呈現了?向對象程序設計的層次結構,體現了由簡單到復雜的認知過程。以前我們接觸的函數層次的復?,繼承是類設計層次的復?。
📝繼承出現前后發生的變化
繼承出現前。舉例說明:在繼承沒出現前我們設計兩個類Student和Teacher類,代碼如下所示
class Student
{
public:// 進?校園/圖書館/實驗室刷?維碼等?份認證void identity(){// ...}// 學習void study(){// ...}
protected:string _name = "peter"; // 姓名string _address; // 地址string _tel; // 電話int _age = 18; // 年齡int _stuid; // 學號
};
class Teacher
{
public:// 進?校園/圖書館/實驗室刷?維碼等?份認證void identity(){// ...}// 授課void teaching(){//...}
protected:string _name = "張三"; // 姓名int _age = 18; // 年齡string _address; // 地址string _tel; // 電話string _title; // 職稱
};
int main()
{return 0;
}
看到上述代碼,我們會發現Student和Teacher類中的保護域當中的成員變量有很多都是冗余的,并且都有identity的成員函數,當然了其中也有各自沒有的成員的變量和成員函數。
那我們現在想解決這部分冗余的代碼,那么我們該如何處理呢?于是繼承應運而生
繼承出現后,我們就可以定義一個公共的成員Person類中,Student和Teacher都繼承Person,派生類Student和Teacher都可以繼承基類Person類中的成員變量,就不需要重復定義了。
class Person
{
public:// 進?校園/圖書館/實驗室刷?維碼等?份認證void identity(){cout << "void identity()" << _name << endl;}
protected:string _name = "張三"; // 姓名string _address; // 地址string _tel; // 電話int _age = 18; // 年齡
};
class Student : public Person
{
public:// 學習void study(){// ...}
protected:int _stuid; // 學號
};
class Teacher : public Person
{
public:// 授課void teaching(){//...}
protected:string title; // 職稱
};
int main()
{Student s;Teacher t;s.identity();t.identity();return 0;
}
觀察上述代碼,可以發現,派生類Student和Teacher類中并沒有_name,_address這些成員變量,也沒有identity這個成員函數,但是我們在main函數中,實例化了一個學生對象s和老師對象t,我們可以發現他居然可以調用Person類中的成員函數identity。
通過上述的小例子,是否已經對繼承有了初步的認識了呢?接下來我們進入對繼承正式的認識吧!
😇繼承定義
📝定義格式
觀察下圖
觀察上圖我們可以知道,Person就是基類,也就是父類。Student是派生類,也稱為子類
關于繼承的一些小tips
- 使?關鍵字class時默認的繼承?式是private,使?struct時默認的繼承?式是public,不過最好顯示的寫出繼承?式。
- 在實際運?中?般使?都是public繼承,?乎很少使?protected/private繼承,也不提倡使?protected/private繼承,因為protected/private繼承下來的成員都只能在派?類的類??使?,實際中擴展維護性不強。
?基類和派生類間的轉換
📋切片或切割
💐public繼承的派?類對象 可以賦值給 基類的指針 / 基類的引?。這?有個形象的說法叫切?或者切割。寓意把派?類中基類那部分切出來,基類指針或引?指向的是派?類中切出來的基類那部分。
注意
基類對象不能復制給派生類對象
我們上代碼來看一下吧
輸入
class Person
{
protected :string _name; // 姓名string _sex; // 性別int _age; // 年齡
};
class Student : public Person
{
public :int _No ; // 學號
};
int main()
{Student sobj ;// 1.派?類對象可以賦值給基類的指針/引?Person* pp = &sobj;Person& rp = sobj;// ?類對象可以賦值給基類的對象是通過調?后?會講解的基類的拷?構造完成的Person pobj = sobj;//2.基類對象不能賦值給派?類對象,這?會編譯報錯sobj = pobj;return 0;
}
注意
派生類Student中繼承了基類中的成員變量,于是我們用派生類對基類進行賦值,此時進行的就是切片。把派生類中繼承基類的部分切片賦值給基類中的成員變量。
📃如何鞏固學習
提示:在學習的過程中,我們需要先自行進行思考,并且多去閱讀一些大佬的書籍,俗話說的好,書籍是人類進步的階梯!
📃本文小結
- 這只是繼承中的一小部分知識,山高路遠,我們下期再見啦!!!!
好啦今日的分享到這里就結束啦,我是愛你們的M malloc希望可以幫助到你們噢,最后別忘記三連啦!!