热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

程序设计与算法三五单元笔记

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

派生的概念

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


继承和派生的概念 :


  1. 派生类是通过对基类进行修改和扩充得到 的。
  2. 在派生类中,可以扩充新的成员变量 和成员函数。
  3. 派生类一经定义后,可以独立使用,不依赖于基类。
  4. 派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public 。
  5. 在派生类的各个成员函数中,不能访问基类中的private成员。

派生类对象的体积

派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对 象新增的成员变量之前。

实例程序:学籍管理
#include >
#include
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; }
};
19
class CUndergraduateStudent:public CStudent
{//本科生类,继承了CStudent类
private:
string department; //学生所属的系的名称
public:
void QualifiedForBaoyan() { //给予保研资格
cout <<“qualified for baoyan” <}
void PrintInfo() {
CStudent::PrintInfo(); //调用基类的PrintInfo
cout <<“Department:” <}
void SetInfo( const string & name_,const string & id_,
int age_,char gender_ ,const string & department_) {
CStudent::SetInfo(name_,id_,age_,gender_); //调用基类的SetInfo
department &#61; department_;
}
};
20
void CStudent::PrintInfo()
{
cout <<"Name:" <cout <<"ID:" <cout <<"Age:" <cout <<"Gender:" <}
void CStudent::SetInfo( const string & name_,const string & id_,
int age_,char gender_ )
{
name &#61; name_;
id &#61; id_;
age &#61; age_;
gender &#61; gender_;
}
21
int main()
{
CUndergraduateStudent s2;
s2.SetInfo(“Harry Potter ”, “118829212”,19,‘M’,“Computer Science”);
cout <s2.QualifiedForBaoyan ();
s2.PrintInfo ();
return 0;
}
22
输出结果&#xff1a;
Harry Potter qualified for baoyan
Name:Harry Potter
ID:118829212
Age:19
Gender:M
Department:Computer Science

类之间的两种关系&#xff1a;


• 继承&#xff1a;“是”关系。

– 基类 A&#xff0c;B是基类A的派生类。 – 逻辑上要求&#xff1a;“一个B对象也是一个A对象”&#xff08;中学生也是学生&#xff09;。


• 复合&#xff1a;“有”关系。 &#xff08;详见2继承关系和复合关系&#xff09;

– 类C中“有”成员变量k&#xff0c;k是类D的对象&#xff0c;则C和D是复合关系 – 一般逻辑上要求&#xff1a;“D对象是C对象的固有属性或组成部分”。  


覆盖 

派生类可以定义一个和基类成员同名的成员&#xff0c;这叫 覆盖。

在派生类中访问这类成员时&#xff0c;缺省的情况是访问派生类中定义的成员。要在派生类中访问由基 类定义的同名成员时&#xff0c;要使用作用域符号::。


真实编程中一般不会定义同名成员变量&#xff0c;只会定义同名成员函数。

  


类的保护成员&#xff08;Protected&#xff09;


在创建派生类的对象时&#xff0c;需要调用基类的构造函数&#xff1a;初始化派 生类对象中从基类继承的成员。在执行一个派生类的构造函数 之前&#xff0c;总是先执行基类的构造函数。


• 调用基类构造函数的两种方式

– 显式方式&#xff1a;在派生类的构造函数中&#xff0c;为基类的构造函数提供 参数. derived::derived(arg_derived-list):base(arg_base-list)

– 隐式方式&#xff1a;在派生类的构造函数中&#xff0c;省略基类构造函数时&#xff0c; 派生类的构造函数则自动调用基类的默认构造函数派生类的析构函数被执行时&#xff0c;执行完派生类的析构函数后&#xff0c;自动调用基类的析构函数。

 


在创建派生类的对象时:


  1. 先执行基类的构造函数&#xff0c;用以初始化派生类对象中从基类继承的成员&#xff1b;
  2. 再执行成员对象类的构造函数&#xff0c;用以初始化派生类对象中 成员对象。 
  3. 最后执行派生类自己的构造函数。

在派生类对象消亡时&#xff1a;


  1. 先执行基类的构造函数&#xff0c;用以初始化派生类对象中从基类 继承的成员&#xff1b;
  2. 再执行成员对象类的构造函数&#xff0c;用以初始化派生类对象中 成员对象。
  3. 最后执行派生类自己的构造函数

 


public继承的赋值兼容规则&#xff1a;

class base { };

class derived : public base { };

base b; derived d; 


  1. 派生类的对象可以赋值给基类对象 b &#61; d;&#xff08;把d中的base复制给b&#xff0c;d&#61;b则错误&#xff09;
  2. 派生类对象可以初始化基类引用 base & br &#61; d; &#xff08;引用d中的base&#xff09;
  3. 派生类对象的地址可以赋值给基类指针 base * pb &#61; & d; &#xff08;pb引用d中的base&#xff09;

 如果派生方式是 private或protected&#xff0c;则上述三条不可行。

 


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
author-avatar
多少年都不会变
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有