博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++基础——类继承
阅读量:6940 次
发布时间:2019-06-27

本文共 3247 字,大约阅读时间需要 10 分钟。

一、前言

  好吧,本系列博客已经变成了《C++ Primer Plus》的读书笔记,尴尬。在使用C语言时,多通过添加库函数的方式实现代码重用,但有一个弊端就是原来写好的代码并不完全适用于现在的情况。OOP设计思想中类的继承相比来说更为灵活,可以添加新的数据成员和方法,也能修改继承下来方法的实现细节,同时还保留了原有的代码。开始进入正题。

二、类继承示例

  场景如下:现需要记录乒乓球运动成员的信息,包括姓名和有无空余桌台。其中有一部分成员参加过比赛,需要将这一部分单独提出并记录他们在比赛中的比分。因此,参加过比赛的成员所属的类就是素有成员所属类的派生类对象了。

类声明:

1 #ifndef TABTENN_H_ 2 #define TABTENN_H_ 3  4 #include 
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 class24 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
tabtenn.h

类方法定义:

1 #include 
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 methods14 //派生类构造函数必须调用基类构造函数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 {}
tabtenn.cpp

  上述代码将基类TableTennisPlayer和派生类RatedPlayer放在了一起。RatedPlayer类声明中使用:public name_of_base_class 表示公有派生。在派生类的声明中要添加自己的构造函数和额外的成员函数和方法。这里派生类构造函数中学问很大。

  在创建派生类对象之前必须先创建基类对象,这是因为派生类的方法无法直接访问基类的私有成员。那问题来了:当创建新的派生类对象时,会自动调用派生类构造函数。如何实现在调用派生类构造函数之前就调用基类构造函数创建基类对象呢?(好绕口)这里需要使用构造函数的特有语法——初始化列表。在程序指针指向派生类构造函数大括号内第一行之前即在初始化列表中完成了基类构造函数的调用。为了方便从基类对象中直接选出派生类对象(基类对象包含派生类对象),使用第二个构造函数,直接为基类对象添加比分信息获得。

三、应用程序示例

应用程序代码:

1 #include 
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 else15 cout << ": hasn't a table.\n";16 rplayer1.Name();17 if(rplayer1.HasTable())18 cout << ": has a table.\n";19 else20 cout << ": hasn't a table.\n";21 22 //initialize RatedPlayer using TableTennisPlayer object23 RatedPlayer rplayer2(1212,player1);24 cout << "Name: ";25 rplayer2.Name();26 cout << ";Rating: " << rplayer2.Rating() << endl;27 return 0;28 }
usett.cpp

   player和rplayer分别代表基类对象和派生类对象。rplayer2和player1其实是同一个人,本来参加过比赛的成员就是从所有成员中挑选出来的。应用该程序比较简单,这里就不过多描述了。

转载于:https://www.cnblogs.com/moluoqishi/p/10732105.html

你可能感兴趣的文章
Huffman Codes
查看>>
求一棵二叉树的镜像
查看>>
Principal Component Analysis(PCA) algorithm summary
查看>>
【安装Ubuntu 遇到问题】 the system is running in low-graphics mode 最新办法解决
查看>>
达拉草201771010105《面向对象程序设计(java)》第十八周学习总结
查看>>
Mysql中文输入出现1366错误的解决办法
查看>>
Ant调用Java中文显示乱码
查看>>
database工具
查看>>
[转] JavaScript 运行机制详解:再谈Event Loop
查看>>
我的转正申请
查看>>
【leetcode】509. Fibonacci Number
查看>>
day10--进程
查看>>
结构训练
查看>>
查询数据库保存成CSV格式
查看>>
enumerate
查看>>
PHP三元运算符 isset的理解
查看>>
dede织梦:文章内容页调用
查看>>
开发中常用的 25 个JavaScript 单行代码
查看>>
phh7 安装redis扩展
查看>>
也许你一直「坚持」不下去,是缺少这个前提
查看>>