zoukankan      html  css  js  c++  java
  • C++基础——类继承

    一、前言

      好吧,本系列博客已经变成了《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
    tabtenn.h

    类方法定义:

     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 {}
    tabtenn.cpp

      上述代码将基类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.
    ";
    14     else
    15         cout << ": hasn't a table.
    ";
    16     rplayer1.Name();
    17     if(rplayer1.HasTable())
    18         cout << ": has a table.
    ";
    19     else
    20         cout << ": hasn't a table.
    ";
    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 }
    usett.cpp

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

  • 相关阅读:
    Swift
    ios中沙盒
    Mac下安装apk(命令形式)
    iOS 保存异常日志
    android sliding menu
    iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
    iOS应用崩溃日志分析
    iOS 推送
    iOS 修改textholder的颜色
    iOS 7.1 UITapGestureRecognizer 不好用的解决办法
  • 原文地址:https://www.cnblogs.com/moluoqishi/p/10732105.html
Copyright © 2011-2022 走看看