C++基础——类继承
2019-04-20 08:52:44来源:博客园 阅读 ()
一、前言
好吧,本系列博客已经变成了《C++ Primer Plus》的读书笔记,尴尬。在使用C语言时,多通过添加库函数的方式实现代码重用,但有一个弊端就是原来写好的代码并不完全适用于现在的情况。OOP设计思想中类的继承相比来说更为灵活,可以添加新的数据成员和方法,也能修改继承下来方法的实现细节,同时还保留了原有的代码。开始进入正题。
二、类继承示例
场景如下:现需要记录乒乓球运动成员的信息,包括姓名和有无空余桌台。其中有一部分成员参加过比赛,需要将这一部分单独提出并记录他们在比赛中的比分。因此,参加过比赛的成员所属的类就是素有成员所属类的派生类对象了。
类声明:
1 #ifndef TABTENN_H_ 2 #define TABTENN_H_ 3 4 #include <string> 5 6 using std::string; 7 8 class TableTennisPlayer 9 { 10 private: 11 string firstname; 12 string lastname; 13 bool hasTable; 14 15 public: 16 TableTennisPlayer (const string& fn = "none", 17 const string& ln = "none",bool ht = false); 18 void Name() const; 19 bool HasTable() const {return hasTable;}; 20 void ResetTable(bool v) {hasTable = v;}; 21 }; 22 23 //derived class 24 class RatedPlayer:public TableTennisPlayer //TableTennisPlayer是基类 25 { 26 private: 27 unsigned int rating; 28 public: 29 RatedPlayer(unsigned int r = 0,const string& fn = "none",const string& ln = "none", 30 bool ht = false);//默认构造函数 31 RatedPlayer(unsigned int r,const TableTennisPlayer& tp);//通过基类对象创建派生类对象构造函数 32 unsigned int Rating() const {return rating;} 33 void ResetRating (unsigned int r) {rating = r;} 34 }; 35 36 #endif
类方法定义:
1 #include <iostream> 2 #include "tabtenn.h" 3 4 TableTennisPlayer::TableTennisPlayer (const string& fn,const string& ln,bool ht): 5 firstname(fn),lastname(ln),hasTable(ht)//成员初始化列表 6 {} 7 8 void TableTennisPlayer::Name() const 9 { 10 std::cout << lastname << ", " << firstname; 11 } 12 13 //RatedPlayer methods 14 //派生类构造函数必须调用基类构造函数 15 RatedPlayer::RatedPlayer(unsigned int r,const string& fn,const string& ln,bool ht): 16 TableTennisPlayer(fn,ln,ht)//派生类构造函数首先创建基类对象,使用初始化列表完成 17 { 18 rating = r; 19 } 20 21 RatedPlayer::RatedPlayer(unsigned int r,const TableTennisPlayer& tp): 22 TableTennisPlayer(tp),rating(r) 23 {}
上述代码将基类TableTennisPlayer和派生类RatedPlayer放在了一起。RatedPlayer类声明中使用:public name_of_base_class 表示公有派生。在派生类的声明中要添加自己的构造函数和额外的成员函数和方法。这里派生类构造函数中学问很大。
在创建派生类对象之前必须先创建基类对象,这是因为派生类的方法无法直接访问基类的私有成员。那问题来了:当创建新的派生类对象时,会自动调用派生类构造函数。如何实现在调用派生类构造函数之前就调用基类构造函数创建基类对象呢?(好绕口)这里需要使用构造函数的特有语法——初始化列表。在程序指针指向派生类构造函数大括号内第一行之前即在初始化列表中完成了基类构造函数的调用。为了方便从基类对象中直接选出派生类对象(基类对象包含派生类对象),使用第二个构造函数,直接为基类对象添加比分信息获得。
三、应用程序示例
应用程序代码:
1 #include <iostream> 2 #include "tabtenn.h" 3 4 using std::endl; 5 using std::cout; 6 7 int main() 8 { 9 TableTennisPlayer player1("Tara","Boomdea",false);//创建基类对象 10 RatedPlayer rplayer1(1140,"Mallory","Duck",true);//创建派生类对象 11 player1.Name(); 12 if(player1.HasTable()) 13 cout << ": has a table.\n"; 14 else 15 cout << ": hasn't a table.\n"; 16 rplayer1.Name(); 17 if(rplayer1.HasTable()) 18 cout << ": has a table.\n"; 19 else 20 cout << ": hasn't a table.\n"; 21 22 //initialize RatedPlayer using TableTennisPlayer object 23 RatedPlayer rplayer2(1212,player1); 24 cout << "Name: "; 25 rplayer2.Name(); 26 cout << ";Rating: " << rplayer2.Rating() << endl; 27 return 0; 28 }
player和rplayer分别代表基类对象和派生类对象。rplayer2和player1其实是同一个人,本来参加过比赛的成员就是从所有成员中挑选出来的。应用该程序比较简单,这里就不过多描述了。
原文链接:https://www.cnblogs.com/moluoqishi/p/10732105.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash