詳解C++基礎(chǔ)——類繼承
一、前言
好吧,本系列博客已經(jīng)變成了《C++ Primer Plus》的讀書(shū)筆記,尷尬。在使用C語(yǔ)言時(shí),多通過(guò)添加庫(kù)函數(shù)的方式實(shí)現(xiàn)代碼重用,但有一個(gè)弊端就是原來(lái)寫(xiě)好的代碼并不完全適用于現(xiàn)在的情況。OOP設(shè)計(jì)思想中類的繼承相比來(lái)說(shuō)更為靈活,可以添加新的數(shù)據(jù)成員和方法,也能修改繼承下來(lái)方法的實(shí)現(xiàn)細(xì)節(jié),同時(shí)還保留了原有的代碼。開(kāi)始進(jìn)入正題。
二、類繼承示例
場(chǎng)景如下:現(xiàn)需要記錄乒乓球運(yùn)動(dòng)成員的信息,包括姓名和有無(wú)空余桌臺(tái)。其中有一部分成員參加過(guò)比賽,需要將這一部分單獨(dú)提出并記錄他們?cè)诒荣愔械谋确?。因此,參加過(guò)比賽的成員所屬的類就是素有成員所屬類的派生類對(duì)象了。
類聲明:
#ifndef TABTENN_H_ #define TABTENN_H_ #include <string> using std::string; class TableTennisPlayer { private: string firstname; string lastname; bool hasTable; public: TableTennisPlayer (const string& fn = "none", const string& ln = "none",bool ht = false); void Name() const; bool HasTable() const {return hasTable;}; void ResetTable(bool v) {hasTable = v;}; }; //derived class class RatedPlayer:public TableTennisPlayer //TableTennisPlayer是基類 { private: unsigned int rating; public: RatedPlayer(unsigned int r = 0,const string& fn = "none",const string& ln = "none", bool ht = false);//默認(rèn)構(gòu)造函數(shù) RatedPlayer(unsigned int r,const TableTennisPlayer& tp);//通過(guò)基類對(duì)象創(chuàng)建派生類對(duì)象構(gòu)造函數(shù) unsigned int Rating() const {return rating;} void ResetRating (unsigned int r) {rating = r;} }; #endif tabtenn.h
類方法定義:
#include <iostream> #include "tabtenn.h" TableTennisPlayer::TableTennisPlayer (const string& fn,const string& ln,bool ht): firstname(fn),lastname(ln),hasTable(ht)//成員初始化列表 {} void TableTennisPlayer::Name() const { std::cout << lastname << ", " << firstname; } //RatedPlayer methods //派生類構(gòu)造函數(shù)必須調(diào)用基類構(gòu)造函數(shù) RatedPlayer::RatedPlayer(unsigned int r,const string& fn,const string& ln,bool ht): TableTennisPlayer(fn,ln,ht)//派生類構(gòu)造函數(shù)首先創(chuàng)建基類對(duì)象,使用初始化列表完成 { rating = r; } RatedPlayer::RatedPlayer(unsigned int r,const TableTennisPlayer& tp): TableTennisPlayer(tp),rating(r) {} tabtenn.cpp
上述代碼將基類TableTennisPlayer和派生類RatedPlayer放在了一起。RatedPlayer類聲明中使用:public name_of_base_class 表示公有派生。在派生類的聲明中要添加自己的構(gòu)造函數(shù)和額外的成員函數(shù)和方法。這里派生類構(gòu)造函數(shù)中學(xué)問(wèn)很大。
在創(chuàng)建派生類對(duì)象之前必須先創(chuàng)建基類對(duì)象,這是因?yàn)榕缮惖姆椒o(wú)法直接訪問(wèn)基類的私有成員。那問(wèn)題來(lái)了:當(dāng)創(chuàng)建新的派生類對(duì)象時(shí),會(huì)自動(dòng)調(diào)用派生類構(gòu)造函數(shù)。如何實(shí)現(xiàn)在調(diào)用派生類構(gòu)造函數(shù)之前就調(diào)用基類構(gòu)造函數(shù)創(chuàng)建基類對(duì)象呢?(好繞口)這里需要使用構(gòu)造函數(shù)的特有語(yǔ)法——初始化列表。在程序指針指向派生類構(gòu)造函數(shù)大括號(hào)內(nèi)第一行之前即在初始化列表中完成了基類構(gòu)造函數(shù)的調(diào)用。為了方便從基類對(duì)象中直接選出派生類對(duì)象(基類對(duì)象包含派生類對(duì)象),使用第二個(gè)構(gòu)造函數(shù),直接為基類對(duì)象添加比分信息獲得。
三、應(yīng)用程序示例
應(yīng)用程序代碼:
#include <iostream> #include "tabtenn.h" using std::endl; using std::cout; int main() { TableTennisPlayer player1("Tara","Boomdea",false);//創(chuàng)建基類對(duì)象 RatedPlayer rplayer1(1140,"Mallory","Duck",true);//創(chuàng)建派生類對(duì)象 player1.Name(); if(player1.HasTable()) cout << ": has a table.\n"; else cout << ": hasn't a table.\n"; rplayer1.Name(); if(rplayer1.HasTable()) cout << ": has a table.\n"; else cout << ": hasn't a table.\n"; //initialize RatedPlayer using TableTennisPlayer object RatedPlayer rplayer2(1212,player1); cout << "Name: "; rplayer2.Name(); cout << ";Rating: " << rplayer2.Rating() << endl; return 0; } usett.cpp
player和rplayer分別代表基類對(duì)象和派生類對(duì)象。rplayer2和player1其實(shí)是同一個(gè)人,本來(lái)參加過(guò)比賽的成員就是從所有成員中挑選出來(lái)的。應(yīng)用該程序比較簡(jiǎn)單,這里就不過(guò)多描述了。
以上所述是小編給大家介紹的C++類繼承詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
上一篇:C++中rapidjson將map轉(zhuǎn)為json的方法
欄 目:C語(yǔ)言
下一篇:C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解
本文標(biāo)題:詳解C++基礎(chǔ)——類繼承
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/332.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹(shù)兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問(wèn)題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置