C++中的繼承特性(1)
1.何為繼承
首先,繼承是什麼?繼承可以簡單理解為孩子繼承了父母雙親的基因,在擁有父母某些特性的同時,又有自己獨立的特性。
在C++中,繼承是類與類之間的繼承,即某個類可以繼承它類的成員變數、成員函式,同時又可以擁有自己獨有的成員變數、成員函式。
繼承定義格式如下:
class <派生類類名>: <繼承方式> <基類類名>
{};
派生類即新生成的類,相當於孩子,又稱子類;基類即原有的類,相當於父親,又稱父類。
其中繼承方式有如下三種:
public(公有繼承):將保留基類成員的原有訪問許可權。即基類中的public成員仍為public,protected成員仍為protected,private仍為private且派生類無權訪問。
protected(保護繼承):將保護基類的所有成員。基類中的私有成員(private)仍無權訪問,但public和protected成員將均作為保護成員繼承。
private(私有繼承):將以私有方式繼承基類的所有成員。即無論成員變數原有訪問許可權是什麼,在派生類中均為私有屬性,但基類的私有成員派生類仍無權訪問。
2.友元與繼承
在類中,友元函式時可以訪問類中的私有成員的,那麼它是否可以訪問派生類中的私有成員呢?
在下圖程式程式碼中,test函式訪問了派生類B的私有成員_b:
由圖可以看到,基類A中的友元函式test無法訪問派生類B中的私有成員,即友元關係是不會被繼承的,因為友元函式並不屬於基類自身的函式。
3.構造、析構的繼承
在繼承中,構造與析構並不會拷貝到派生類中,而是在派生類建構函式的初始化列表中會自動呼叫基類的建構函式,示例程式如下:
class Parent{
public:
Parent(){
cout << "Parent()" << endl;
}
~Parent(){
cout << "~Parent()" << endl;
}
private:
int _p;
};
class Child:public Parent
{
public:
Child(){
cout << "Child()" << endl;
}
~Child(){
cout << "~Child()" << endl;
}
private:
int _c;
};
void FunTest(){
Parent p;
Child c;
}
int main(){
FunTest();
system("pause");
return 0;
}
程式最終執行結果如下:
(1)建構函式的執行過程
a)其中第一個Parent()是構造物件p時輸出的,彙編指令如下圖:
b)而後在構造物件c時,首先進入c的建構函式,如下圖:
c)在下圖中可以看到,在執行建構函式體(即輸出”Child()”字串)之前,程式會呼叫一次Parent建構函式,故派生類會在建構函式的初始化列表中呼叫基類的建構函式。
總結:派生類建構函式執行如下:
(2)解構函式的執行過程
在一個函式執行完畢後,需將其中的區域性變數釋放,若區域性變數是某類的物件,則釋放前會呼叫類的解構函式。
a)對於FunTest函式,先定義了p物件,再定義了c物件,則會先釋放c,再釋放p,彙編指令如下:
b)而後進入派生類Child的解構函式:
c)執行了函式體之後:
d)在Child解構函式執行完畢後可看到如下一條call指令,故而在析構c物件時,會先列印~child(),再列印~Parent():
總結:派生類解構函式執行過程如下:
由棧的先進後出原則,先定義的變數必定最後釋放,故析構變數的順序也是如此。
本文為博主初學繼承的一些認識,如有錯誤或不當之處,歡迎大家批評指正!
相關推薦
C++中的繼承特性(1)
1.何為繼承 首先,繼承是什麼?繼承可以簡單理解為孩子繼承了父母雙親的基因,在擁有父母某些特性的同時,又有自己獨立的特性。 在C++中,繼承是類與類之間的繼承,即某個類可以繼承它類的成員變數、成員函
C++11新特性(1)-long long
溫故而知新迄今為止的職業生涯中,有過兩次集中時間學習C++的經歷。第一次大概是在1994年前後,那時非計算機專業大學畢業剛接觸C++,學的是還是BorlandC++3.1的手冊。許多東西都是一知半解就開始了應用,但即使是這樣,還是充分感覺到C++的強大,非常喜歡C++帶來的那
C# 7.0 新特性(1): 基於Tuple的“多”返回值方法
本文基於Roslyn專案中的Issue:#347 展開討論. 回顧 首先,提出一個問題,C#中,如何使一個方法可返回”多個”返回值? 我們先來回顧一下C#6.0 及更早版本的做法。 在C#中,通常我們有以下4種方式使一個方法返回多條資料。 使用 KeyVal
NET快取框架CacheManager在混合式開發框架中的應用(1)-CacheManager的介紹和使用 基於C#的MongoDB資料庫開發應用(4)--Redis的安裝及使用
在我們開發的很多分散式專案裡面(如基於WCF服務、Web API服務方式),由於資料提供涉及到資料庫的相關操作,如果客戶端的併發數量超過一定的數量,那麼資料庫的請求處理則以爆發式增長,如果資料庫伺服器無法快速處理這些併發請求,那麼將會增加客戶端的請求時間,嚴重者可能導致資料庫服務或者應用服務直接癱瘓。快取方案
.NET快取框架CacheManager在混合式開發框架中的應用(1)-CacheManager的介紹和使用 基於C#的MongoDB資料庫開發應用(4)--Redis的安裝及使用
在我們開發的很多分散式專案裡面(如基於WCF服務、Web API服務方式),由於資料提供涉及到資料庫的相關操作,如果客戶端的併發數量超過一定的數量,那麼資料庫的請求處理則以爆發式增長,如果資料庫伺服器無法快速處理這些併發請求,那麼將會增加客戶端的請求時間,嚴重者可能導致資料庫服務或者應用服務直接癱瘓。快取方案
Spring Cloud中Feign的繼承特性 (12)
轉自 https://blog.csdn.net/u012702547/article/details/77823434 這個系列我感覺真的太好了,可以一步一步的瞭解spring cloud 的搭建以及更深層次的東西,對想學這門技術的朋友真的入門特別的快,感謝這位大哥的分享,我也會持
C語言中位操作符(1)-計算機中的整數表示方法
寫在前面 長久以來,位操作符一直困擾著我,為什麼呢?因為其雖易用,但是我自己卻理解不透徹,用著總覺得有隱患?那麼今天就來詳細地理一下計算機中的位操作符與整數在計算機中的儲存。 本文是作為一個非科班出身程式設計師的自我學習記錄之作,如果能夠在自我提高的同時也能幫
C#如何訪問Lua中的屬性(1)
參考 http://www.myexception.cn/c-sharp/1881698.html C#如何訪問Lua中的屬性 1) .C#如何訪問LUA中的屬性? 2) .C#如何訪問LUA中的函式? 3) .C#如何訪問LUA中的表? 第一個檔案
bash基礎特性(1)
defaults history 緩沖區 記錄 歷史 所有的環境變量可以通過 ehco $# 查看 #為環境變量 bash的基礎特性:(1)命令歷史 history 環境變量: HISTSIZE:命令歷史記錄的條數 HISTFILE;~/.bash_history HIST
python中的JSON(1)
welcome 定義 ack () found 存儲 remember nbsp python程序 很多程序都要求用戶輸入某種信息, 例如: 讓用戶存儲遊戲首選項或提供要可視化的數據,程序把用戶的信息存儲在列表和字典等數據結構中, 用戶關閉程序時,我們幾乎總要保存他們提
C#中的struct(結構)為值類型,struct類型全接觸
line 輸出 其他 重要 影響 初始化 最大 cat type類 眾所周知,struct類型和class類型非常相似,尤其是在C++中,class可以辦到的事struct幾乎都可以實現。在C#中struc類型依然存在,它的用處相對來說已經顯得越來越不重要,這裏主要講述一下
C#類和結構(1)
mar 安全 類型安全 readline 參數 部分 public 方法的參數 play 1、結構功能特性? 實現代碼? 結構用struct關鍵字定義的,與類類似,但有本質區別。結構實質是一個值類型,它不需要對分配的。 結構的特性: (1)、結構作為參數傳遞時,是值傳遞。
C++中的常量(一) const限定符
無法 簡單的 對象 可能 函數重載 struct 理解 變量 必須 最近在重新看<<C++ Primer>>,第一遍的時候const和constexpr看得並不太懂,這次又有了些更新的理解,當然可能仍然有許多不對的地方... 首先,const限定符即
無源射頻混頻器的基本特性(1)
tar media 留下 時域 過程 inter local logs 運算 混頻器的一個重要作用就是頻率搬運,即將中頻信號搬運到射頻段,或者將射頻信號搬運到中頻段,前者稱為上變頻,後者稱為下變頻。 以上變頻為例,在實際使用中f0稱為IF(Intermediate Fre
c++ 部分基礎知識 ---- (1)
知識 gin href com cin http targe 基礎知識 ucs 灰dtj4慚fv腺伎孕6xnhttp://www.docin.com/app/user/userinfo?userid=179253887 傅zpf攣詿4隊餵皇影http://www.doci
MySQL存儲過程定義中的特性(characteristic)的含義
自己 mysql存儲 備註 但是 無法 sql 對象 許可 遇到 MySQL的存儲過程蠻啰嗦的,與MSSQL或者Oracle的存儲過程相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的默認值來創建存儲過程 通常在使用圖形界面工具進
C++中重載(overload)、覆蓋(override)與隱藏(oversee)
acl 普通 evc dft war srx rpo 成員 avt body, table{font-family: 微軟雅黑; font-size: 10pt} table{border-col
大數據生態圈中相關原理(1)
兩種 大數據 進行 排序 表示 數據塊 溢出 任務 傳輸數據 MapReduce 原理 客戶端任務到jobTracker, jobTracker分發任務到map和reduce。 map從datasplit 中獲取數據區,根據客戶端的相關業務邏輯生成(K,V)對,數據先緩存到
設計一款c#自動程式碼生成器 (1)
1,構思配置驅動檔案生成 網上自動化指令碼生成的思路是 1)設定好對應的模板 2)讀取資料庫對應的檔案 3)根據模板對應的欄位替換生成 模板》讀取資料》生成對應檔案 為什麼會有做自動化指令碼的想法,是因為工作中發現protobuf 這個工具可以自動編譯根據伺服器生成對應的cs檔案 所以我這裡想仿
C++中的回車(\n)和換行(\r)
‘\n’ 換行,游標移到下一行的開頭; '\r' 回車,游標移到當前行的開頭,不會換到下一行,如果接著輸出的話,本行以前的內容會被逐一覆蓋; #include <iostream> using namespace std;