c++中的繼承與派生使用詳解
1、繼承與派生是C++的核心概念
首先需明確,繼承和派生是class之間,以及基于class生成的實(shí)例之間的包含與被包含關(guān)系,至于為什么不認(rèn)為是數(shù)學(xué)中集合與子集來形容,因?yàn)楦拍钌线€是存在一些區(qū)別的。
2、什么是繼承與派生
繼承(Inheritance)可以理解為一個(gè)類從另一個(gè)類獲取成員變量和成員函數(shù)的過程。例如類 B 繼承于類 A,那么 B 就擁有 A 的成員變量和成員函數(shù)。
在C++中,派生(Derive)和繼承是一個(gè)概念,只是站的角度不同。繼承是兒子接收父親的產(chǎn)業(yè),派生是父親把產(chǎn)業(yè)傳承給兒子。
被繼承的類稱為父類或基類,繼承的類稱為子類或派生類。“子類”和“父類”通常放在一起稱呼,“基類”和“派生類”通常放在一起稱呼。
派生類除了擁有基類的成員,還可以定義自己的新成員,以增強(qiáng)類的功能。
3、c++中繼承與派生的作用
最常見的我們校園網(wǎng)管理系統(tǒng),首先大致可以分為以下幾種類型,學(xué)生,老師。學(xué)生再細(xì)分,可以分為???,本科,碩士,博士。
老師也可以分為,講師,副教授,教授,此外還有不教授學(xué)科,專門做管理和后勤方面的老師。
我們校園網(wǎng)系統(tǒng)中,需要錄入所有這些人的信息。此時(shí)如果我們?yōu)槊恳环N類型群體單獨(dú)建立一個(gè)class,其實(shí)也可以實(shí)現(xiàn),但是思考以下問題:
(1)所有人是否都需要一些基礎(chǔ)屬性,如年齡,姓名
(2)如果每一類人群,單獨(dú)寫一個(gè)對(duì)應(yīng)的class,是否每一個(gè)class中都要定義一個(gè)一次年齡和姓名成員變量。這樣就會(huì)照成代碼的臃腫。
對(duì)于以上問題,故我們提出了繼承的概念,現(xiàn)在我們定義一個(gè)名為people的class,里面定義了最為基礎(chǔ)的性質(zhì),后續(xù)學(xué)生類型的class,老師類型的class,都繼承這個(gè)基礎(chǔ)people,就可以使得代碼結(jié)構(gòu)優(yōu)化。
3.1 實(shí)際代碼中說明
接著上段來思考,此時(shí)我們需要定義學(xué)生的class,基于繼承people,此時(shí)我們還要為學(xué)生添加一些信息,如學(xué)生的成績,文科,理科,或工科生,學(xué)生年級(jí),屬于那個(gè)學(xué)院。
閑話少說,先看代碼:
class People{
public:
void setname(char *name);
void setage(int age);
char *getname();
int getage();
private:
char *m_name;
int m_age;
};
void People::setname(char *name){ m_name = name; }
void People::setage(int age){ m_age = age; }
char* People::getname(){ return m_name; }
int People::getage(){ return m_age;}
//派生類 Student
class Student: public People{
public:
void setscore(float score);
float getscore();
private:
float m_score;
};
void Student::setscore(float score){ m_score = score; }
float Student::getscore(){ return m_score; }
class Student: public People;此語句是定義了Student繼承了,people。
詳細(xì)拆解如下:先同普通class定義一樣。先寫class Student,然后后+一個(gè)“:”即單個(gè)封號(hào),封號(hào)后+一個(gè)繼承類型的定義(一共有3種繼承方式,后文詳細(xì)說明),繼承方式說明后,+被繼承的class名稱寫上,最后不要忘記“;”構(gòu)成一個(gè)完整的語句。
3.2 繼承類型的詳細(xì)說明
public、protected、private 指定繼承方式,這3種關(guān)鍵字不僅僅只可以修飾成員變量,還可以修飾繼承的類型,這一點(diǎn)需切記。
以下是詳細(xì)的解釋:
1) public繼承方式
- 基類中所有 public 成員在派生類中為 public 屬性;
- 基類中所有 protected 成員在派生類中為 protected 屬性;
- 基類中所有 private 成員在派生類中不能使用。
2) protected繼承方式
- 基類中的所有 public 成員在派生類中為 protected 屬性;
- 基類中的所有 protected 成員在派生類中為 protected 屬性;
- 基類中的所有 private 成員在派生類中不能使用。
3) private繼承方式
- 基類中的所有 public 成員在派生類中均為 private 屬性;
- 基類中的所有 protected 成員在派生類中均為 private 屬性;
- 基類中的所有 private 成員在派生類中不能使用。
| 基類成員在基類中的屬性 | public 繼承 | protected 繼承 | private 繼承 |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | 不可訪問 | 不可訪問 | 不可訪問 |
記憶口訣(簡短好記)
“繼承方式是天花板,成員權(quán)限不上升”
解釋:
- 繼承方式(public /protected/private)決定了派生類中成員的最高訪問權(quán)限(天花板)。
- 基類成員在派生類中的訪問權(quán)限 = min (基類原權(quán)限,繼承方式權(quán)限)(取更嚴(yán)格的那個(gè))。
- 無論哪種繼承方式,基類 private 成員始終不可訪問。
- protected 成員和 private 成員類似,也不能通過對(duì)象訪問。但是當(dāng)存在繼承關(guān)系時(shí),protected 和 private 就不一樣了:基類中的 protected 成員可以在派生類中使用,而基類中的 private 成員不能在派生類中使用,下面是詳細(xì)講解。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
c++ 連接兩個(gè)字符串實(shí)現(xiàn)代碼 實(shí)現(xiàn)類似strcat功能
c++ 連接兩個(gè)字符串實(shí)現(xiàn)代碼 實(shí)現(xiàn)類似strcat功能,需要的朋友可以參考下2012-05-05
C++中高性能內(nèi)存池的實(shí)現(xiàn)詳解
在 C/C++ 中,內(nèi)存管理是一個(gè)非常棘手的問題,我們?cè)诰帉懸粋€(gè)程序的時(shí)候幾乎不可避免的要遇到內(nèi)存的分配邏輯。本文將通過C++實(shí)現(xiàn)高性能內(nèi)存池,感興趣的可以了解一下2022-10-10
VC中CWinThread類以及和createthread API的區(qū)別分析
這篇文章主要介紹了VC中CWinThread類以及和createthread API的區(qū)別分析,較為詳細(xì)的講述了CWinThread類的原理,并以實(shí)例形式對(duì)AfxBeginThread函數(shù)的內(nèi)部實(shí)現(xiàn)進(jìn)行了解釋說明,需要的朋友可以參考下2014-10-10
C語言鏈表案例學(xué)習(xí)之通訊錄的實(shí)現(xiàn)
為了將所學(xué)到的鏈表的知識(shí)進(jìn)行鞏固學(xué)習(xí),做到學(xué)以致用,本文將利用鏈表制作一個(gè)簡單的通訊錄。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-10-10

