详解C++基础——类继承
一、前言
好吧,本系列博客已经变成了《C++ Primer Plus》的读书笔记,尴尬。在使用C语言时,多通过添加库函数的方式实现代码重用,但有一个弊端就是原来写好的代码并不完全适用于现在的情况。OOP设计思想中类的继承相比来说更为灵活,可以添加新的数据成员和方法,也能修改继承下来方法的实现细节,同时还保留了原有的代码。开始进入正题。
二、类继承示例
场景如下:现需要记录乒乓球运动成员的信息,包括姓名和有无空余桌台。其中有一部分成员参加过比赛,需要将这一部分单独提出并记录他们在比赛中的比分。因此,参加过比赛的成员所属的类就是素有成员所属类的派生类对象了。
类声明:
#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);//默认构造函数 RatedPlayer(unsigned int r,const TableTennisPlayer& tp);//通过基类对象创建派生类对象构造函数 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 //派生类构造函数必须调用基类构造函数 RatedPlayer::RatedPlayer(unsigned int r,const string& fn,const string& ln,bool ht): TableTennisPlayer(fn,ln,ht)//派生类构造函数首先创建基类对象,使用初始化列表完成 { rating = r; } RatedPlayer::RatedPlayer(unsigned int r,const TableTennisPlayer& tp): TableTennisPlayer(tp),rating(r) {} tabtenn.cpp
上述代码将基类TableTennisPlayer和派生类RatedPlayer放在了一起。RatedPlayer类声明中使用:public name_of_base_class 表示公有派生。在派生类的声明中要添加自己的构造函数和额外的成员函数和方法。这里派生类构造函数中学问很大。
在创建派生类对象之前必须先创建基类对象,这是因为派生类的方法无法直接访问基类的私有成员。那问题来了:当创建新的派生类对象时,会自动调用派生类构造函数。如何实现在调用派生类构造函数之前就调用基类构造函数创建基类对象呢?(好绕口)这里需要使用构造函数的特有语法——初始化列表。在程序指针指向派生类构造函数大括号内第一行之前即在初始化列表中完成了基类构造函数的调用。为了方便从基类对象中直接选出派生类对象(基类对象包含派生类对象),使用第二个构造函数,直接为基类对象添加比分信息获得。
三、应用程序示例
应用程序代码:
#include <iostream> #include "tabtenn.h" using std::endl; using std::cout; int main() { TableTennisPlayer player1("Tara","Boomdea",false);//创建基类对象 RatedPlayer rplayer1(1140,"Mallory","Duck",true);//创建派生类对象 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其实是同一个人,本来参加过比赛的成员就是从所有成员中挑选出来的。应用该程序比较简单,这里就不过多描述了。
以上所述是小编给大家介绍的C++类继承详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
上一篇:C++中rapidjson将map转为json的方法
栏 目:C语言
下一篇:C++ Primer中&、*符号的多重定义与int *p和int* p的区别讲解
本文标题:详解C++基础——类继承
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/332.html
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10求子数组最大和的解决方法详解
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10HDOJ 1443 约瑟夫环的最新应用分析详解
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10如何查看进程实际的内存占用情况详解
- 01-10深入Main函数中的参数argc,argv的使用详解
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法实例总结
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 04-02jquery与jsp,用jquery
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置