詳解C++基礎(chǔ)——類繼承
一、前言
好吧,本系列博客已經(jīng)變成了《C++ Primer Plus》的讀書筆記,尷尬。在使用C語言時,多通過添加庫函數(shù)的方式實(shí)現(xiàn)代碼重用,但有一個弊端就是原來寫好的代碼并不完全適用于現(xiàn)在的情況。OOP設(shè)計(jì)思想中類的繼承相比來說更為靈活,可以添加新的數(shù)據(jù)成員和方法,也能修改繼承下來方法的實(shí)現(xiàn)細(xì)節(jié),同時還保留了原有的代碼。開始進(jìn)入正題。
二、類繼承示例
場景如下:現(xiàn)需要記錄乒乓球運(yùn)動成員的信息,包括姓名和有無空余桌臺。其中有一部分成員參加過比賽,需要將這一部分單獨(dú)提出并記錄他們在比賽中的比分。因此,參加過比賽的成員所屬的類就是素有成員所屬類的派生類對象了。
類聲明:
#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);//通過基類對象創(chuàng)建派生類對象構(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)建基類對象,使用初始化列表完成
{
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é)問很大。
在創(chuàng)建派生類對象之前必須先創(chuàng)建基類對象,這是因?yàn)榕缮惖姆椒o法直接訪問基類的私有成員。那問題來了:當(dāng)創(chuàng)建新的派生類對象時,會自動調(diào)用派生類構(gòu)造函數(shù)。如何實(shí)現(xiàn)在調(diào)用派生類構(gòu)造函數(shù)之前就調(diào)用基類構(gòu)造函數(shù)創(chuàng)建基類對象呢?(好繞口)這里需要使用構(gòu)造函數(shù)的特有語法——初始化列表。在程序指針指向派生類構(gòu)造函數(shù)大括號內(nèi)第一行之前即在初始化列表中完成了基類構(gòu)造函數(shù)的調(diào)用。為了方便從基類對象中直接選出派生類對象(基類對象包含派生類對象),使用第二個構(gòu)造函數(shù),直接為基類對象添加比分信息獲得。
三、應(yīng)用程序示例
應(yīng)用程序代碼:
#include <iostream>
#include "tabtenn.h"
using std::endl;
using std::cout;
int main()
{
TableTennisPlayer player1("Tara","Boomdea",false);//創(chuàng)建基類對象
RatedPlayer rplayer1(1140,"Mallory","Duck",true);//創(chuàng)建派生類對象
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分別代表基類對象和派生類對象。rplayer2和player1其實(shí)是同一個人,本來參加過比賽的成員就是從所有成員中挑選出來的。應(yīng)用該程序比較簡單,這里就不過多描述了。
以上所述是小編給大家介紹的C++類繼承詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
C/C++浮點(diǎn)數(shù)使用的兩個注意事項(xiàng)詳解
浮點(diǎn)數(shù)都是有符號的,沒有 unsigned 浮點(diǎn)數(shù),下面這篇文章主要給大家介紹了關(guān)于C/C++浮點(diǎn)數(shù)使用的兩個注意事項(xiàng),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
C++中Semaphore內(nèi)核對象用法實(shí)例
這篇文章主要介紹了C++中Semaphore內(nèi)核對象用法實(shí)例,有助于深入了解信號量(Semaphore)的基本用法,需要的朋友可以參考下2014-10-10
C語言與java語言中關(guān)于二維數(shù)組的區(qū)別
這篇文章主要介紹了C語言與java語言中關(guān)于二維數(shù)組的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
C++基于CreateToolhelp32Snapshot獲取系統(tǒng)進(jìn)程實(shí)例
這篇文章主要介紹了C++基于CreateToolhelp32Snapshot獲取系統(tǒng)進(jìn)程實(shí)例,是Windows應(yīng)用程序設(shè)計(jì)中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10
C++實(shí)現(xiàn)LeetCode(123.買股票的最佳時間之三)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(123.買股票的最佳時間之三),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

