PKU C++程序设计实习 学习笔记2

第五章 继承与派生

5.1 继承和派生

继承和派生的概念

继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类)。

派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。

派生类一经定义后,可以独立使用,不依赖于基类。

派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public 。在派生类的各个成员函数中,不能访问基类中的private成员。

需要继承机制的例子

所有的学生都有的共同属性:姓名、学号、性别、成绩  所有的学生都有的共同方法(成员函数):是否该留级、是否该奖励

而不同的学生,又有各自不同的属性和方法。研究生:导师、系,大学生:系,中学生:竞赛特长加分

如果为每类学生都从头编写一个类,显然会有不少重复的代码,浪费。比较好的做法是编写一个“学生”类,概括了 各种学生的共同特点,然后从“学生”类派 生出“大学生”类,“中学生”类,“研究 生类”。

派生类的写法

class 派生类名:public 基类名
{

};

例子

class CStudent
{
  private:
    string sName;
    int nAge;
  public:
    bool IsThreeGood() { };
    void SetName( const string & name )
    { sName = name; }
    //......
};
class CUndergraduateStudent: public CStudent
{
  private:
    int nDepartment;
  public:
    bool IsThreeGood() { ...... }; //覆盖
    bool CanBaoYan() { .... };
}; // 派生类的写法是:类名: public 基类名

覆盖:派生类中的成员函数和基类中的完全一样,但行为可能需要不一样,所以在派生类中对函数的行为重新编写。这里感觉应该是隐藏,而不是覆盖,至于重载、覆盖、隐藏等的区别,后面有时间专门写个博客总结下。

派生类对象的内存空间

派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。

在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。

class CBase
{
  int v1,v2;
};
class CDerived:public CBase
{
  int v3;
};

继承实例程序:学籍管理

#include <iostream>
#include <string>
using namespace std;
class CStudent
{
   private:
     string name;
     string id; //学号
     char gender; //性别,'F'代表女,'M'代表男
     int age;
   public:
     void PrintInfo();
     void SetInfo( const string & name_,const string & id_,int age_, char gender_ );
     string GetName() { return name; }
};
class CUndergraduateStudent:public CStudent
{//本科生类,继承了CStudent类
   private:
     string department; //学生所属的系的名称
   public:
     void QualifiedForBaoyan() { //给予保研资格
       cout << “qualified for baoyan” << endl;
     }
     void PrintInfo() {
       CStudent::PrintInfo(); //调用基类的PrintInfo
       cout << “Department:” << department <<endl;
     }
     void SetInfo( const string & name_,const string & id_,int age_,char gender_ ,const string & department_) {
       CStudent::SetInfo(name_,id_,age_,gender_); //调用基类的SetInfo
       department = department_;
     }
};
void CStudent::PrintInfo()
{
  cout << "Name:" << name << endl;
  cout << "ID:" << id << endl;
  cout << "Age:" << age << endl;
  cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
  name = name_;
  id = id_;
  age = age_;
  gender = gender_;
}
int main()
{
  CUndergraduateStudent s2;
  s2.SetInfo(“Harry Potter ”, “118829212”,19,‘M’,“Computer Science”);
  cout << s2.GetName() << “ ” ;
  s2.QualifiedForBaoyan ();
  s2.PrintInfo ();
  return 0;
}
输出结果:
Harry Potter qualified for baoyan
Name:Harry Potter
ID:118829212
Age:19
Gender:M
Department:Computer Science

像在派生类的PrintInfo函数中那样,先调用了基类里面的同名成员函数,完成跟基类有关的事。然后再写一些代码,完成跟派生有关的事。这种做法实际上是特别常见的。

时间: 2024-10-17 14:12:56

PKU C++程序设计实习 学习笔记2的相关文章

PKU C++程序设计实习 学习笔记4 文件操作和模板

第七章 文件操作和模板 7.1 文件操作 7.2 函数模板 泛型程序设计(Generic Programming) 算法实现时不指定具体要操作的数据的类型 泛型--算法实现一遍,适用于多种数据结构 优势: 减少重复代码的编写 两种类型 函数模板 类模板 与"抽象.封装.继承.多态"并列 函数模板 template<class 类型参数1, class 类型参数2, - > 返回值类型 模板名 (形参表) { 函数体 } 例子,交换两个变量值的函数模板 template &l

PKU C++程序设计实习 学习笔记

1.7 内联函数和重载函数 内联函数:函数调用是有时间开销的.如果函数本身只有几条语句,执行非常快,而且函数被反复执行很多次,相比之下调用函数所产生的这个开销就会显得比较大. 为了减少函数调用的开销,引入了内联函数机制.编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句. 重载函数:一个或多个函数,名字相同,然而参数个数或参数类型不相同,这叫做函数的重载.编译器根据调用语句的中的实参的个数和类型判断应该调用哪个函数. (1) int Max(doubl

PKU C++程序设计实习 学习笔记6 标准模板库STL

标准模板库STL 8.1 STL概述 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用:1.面向对象的思想:继承和多态,标准类库  2.泛型程序设计(generic programming) 的思想: 模板机制,以及标准模板库 STL 简单地说就是使用模板的程序设计法. 将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法. 标准模

PKU C++程序设计实习 学习笔记3 多态与虚函数

第六章 多态与虚函数 6.1 多态和虚函数的基本概念 引言 多态是面向对象程序设计里面非常重要的这个机制.它能很有效的提高程序的可扩充性. 有些程序设计语言有被对象继承的概念,但是没有多态的概念,那这样的程序设计语言只能被称作基于对象的程序设计语言,而不能称为面向对象的语言, 比方说visual basic. 虚函数 在类的定义中,前面有 virtual 关键字的成员函数就是虚函数. class base { <span style="color:#ff0000;">vir

PKU C++程序设计实习 学习笔记4 运算符重载

第四章 运算符重载 4.1 运算符重载的基本概念 1. 运算符 2. 自定义数据类型与运算符重载 C++提供了数据抽象的手段:用户自己定义数据类型 -- 类 ? 调用类的成员函数->操作它的对象 类的成员函数->操作对象时,很不方便 ? 在数学上,两个复数可以直接进行+/-等运算 Vs. 在C++中,直接将+或-用于复数是不允许的 3. 运算符重载 对抽象数据类型也能够直接使用C++提供的运算符 ? 程序更简洁 ? 代码更容易理解 运算符重载 ? 对已有的运算符赋予多重的含义 ? 使同一运算符

《JavaScript高级程序设计》学习笔记12篇

写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的东西进去 目录 JS学习笔记1_基础与常识 JS学习笔记2_面向对象 JS学习笔记3_函数表达式 JS学习笔记4_BOM JS学习笔记5_DOM JS学习笔记6_事件 JS学习笔记7_表单脚本 JS学习笔记8_错误处理 JS学习笔记9_JSON JS学习笔记10_Ajax JS学习笔记11_高级技巧

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.

1 《JavaScript高级程序设计》学习笔记(1)

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 首先,我将从<JavaScript高级程序设计>这本JavaScript学习者必看的经典教程开始,JavaScript的很多语法规则及习惯用法和Java极其相似,因此对于有Java基础的学习者来说,JS是很容易上手的.该系列的每次更新将对应原书的一章内容,本次更新对应原书的第三章,主要是一些基本概念,内容很简单, 知识点也较少. 1.和一般的编程语言一样,标识符可以由字母.数字.下划线和美元符组成

《JavaScript高级程序设计》学习笔记(4)——引用类型

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第五章内容. 在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,通常也被称为类,有时候也被成为对象定义,因为他们描述的是一类对象所具有的属性和方法.对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的, var person = new Object() ; 创建了一个object对象.构造函数