《C++程序设计教程》——继承与多态

news/2024/7/3 12:52:48 标签: 多态, 继承, C++

继承与多态">第3章 继承多态

继承">3.1 继承

继承的概念">3.1.1 继承的概念

注意:
1. 基类的构造函数和析构函数不可以被继承
2. 派生类继承了基类的全部数据成员和除了构造、析构函数之外的所有成员函数。派生类对于基类成员的继承是没有选择的,不能选择接收或舍弃基类中的某些成员。
3. 派生类中除了与基类同名的成员外还可以添加新成员,用于实现新功能,保证派生类的功能在基类的基础上的发展。
4. 多个派生类可以继承自一个基类。
5. C++中可以通过派生形成类的层次结构,即一个基类可以是另一个更高层次类的派生类,而另一个派生类也可以继续产生派生类。

继承权限">3.1.2 继承权限

这里写图片描述

3.1.3 派生类操作基类对象的四种方法

1.派生类对象可以向基类对象赋值。(单项的,不可逆)
2.派生类对象可以替代基类对象向基类对象的引用进行赋值或初始化。

ClassA obj_a;
ClassB obj_b;
ClassA &refa = obj_a;//可以将这一行改为 ClassA &refa = obj_b; 

3.如果函数的参数是基类对象或基类对象的引用,函数调用时的实参可以是派生类对象。

void func(ClassA &ref)
{
    cout<<ref.num<<endl;
}

在调用func()函数时可以用派生类ClassB的对象obj_b作实参:

func(obj_b);

4.派生类对象的地址可以赋值给基类指针变量。

3.2 派生类

3.2.1 构造函数

派生类中定义带参数构造函数的形式如下所示:

派生类名::派生类构造函数名(参数列表):基类构造函数名(基类构造函数参数表)
{
    派生类新增成员的初始化语句
}

3.2.2 析构函数

若派生类中没有显式的定义析构函数,编译系统会提供一个默认的析构函数。显式定义中,对象生命周期结束时会先调用派生类的析构函数,再调用基类的析构函数。

3.2.3 隐藏基类函数

派生类中重新定义基类同名函数的方法,称为对基类函数的覆盖或改写,覆盖后基类同名函数在派生类中被隐藏。定义派生类对象调用该函数时,调用的是自身的函数,基类同名函数不被调用。

继承">3.3 多重继承

继承的方式">3.3.1 声明多重继承的方式

class 派生类名:继承方式 基类1名称,继承方式 基类2名称,...
{
    public:
        新增加的公有成员
    protected:
        新增加的保护成员
    private:
        新增加的私有成员
}

继承派生类的构造函数">3.3.2 多重继承派生类的构造函数

定义:

派生类名::派生类构造函数名(参数总表):基类1构造函数名(参数表1),基类2构造函数名(参数表2),...
{
    派生类构造函数体
}

假如派生类是多重继承,并且新增数据成员有一个或多个对象成员,那么派生类需要初始化的数据有三部分:继承的数据成员、新增类的数据成员、新增普通成员。
这种复杂派生类定义:

派生类名::派生类构造函数名(参数总表):基类1构造函数名(参数表1),基类2构造函数名(参数表2),...子对象名1(参数表n),子对象名2(参数表n+1)
{
    派生类构造函数体
}

派生类构造函数调用顺序:
首先,调用基类构造函数。
其次,调用对象成员的构造函数。
最后,调用派生类的构造函数。

继承引起的二义性">3.3.3 多重继承引起的二义性

  1. 调用不同基类中的同名成员时产生的二义性
    消除方法:
    (1)使用作用域限定符
    (2)派生类中定义与基类同名函数,将基类函数隐藏
  2. 派生类中访问公有成员时产生二义性

3.3.4 虚基类

在多重继承中,若一个类声明为虚基类,则能保证一个派生类间接地多次继承该类时,派生类中只继承该基类的一份成员,避免了派生类中访问公共基类公有属性多份拷贝的二义性。
定义:

class 派生类名:virtual 继承方式  基类名
{
    派生类成员
};

多态">3.4 多态

多态性概念">3.4.1 多态性概念

3.4.2 虚函数

虚函数是运行时多态,若某个基类函数声明为虚函数,则其公有派生类将定义与其基类虚函数原型相同的函数,这时,当使用基类指针或基类引用操作派生类对象时,系统会自动用派生类中的同名函数代替基类虚函数。
声明形式:

class 类名
{
    virtual 函数返回值类型  函数名(参数表)
}
  1. 一般虚函数成员
    带有虚函数时,C++编译器的操作步骤:
    (1)为各个类建立虚函数列表,若无虚函数则不操作。
    (2)暂不连接虚函数,只是将各个虚函数地址放入虚函数表。
    (3)连接各静态函数。
  2. 虚析构函数

3.4.3 纯虚函数

在定义一个表示抽象概念的类时,有时无法或者不需要给出某些成员函数的具体实现,函数的实现在派生类中完成,基类中这样的函数声明为纯虚函数。
与虚函数相比,纯虚函数没有函数体,其作用是在基类中为派生类保留一个接口,方便派生类根据需要对它实现,实现多态
声明形式:

virtual 函数返回值类型  函数名(参数表)= 0 ; 

3.5 抽象类与内部类

3.5.1 抽象类

如果一个类中至少包含一个纯虚函数,则该类成为抽象类,因此抽象类是基于纯虚函数的。
定义形式:

class 类名
{
    public:
    virtual 函数返回值类型  函数名(参数表)= 0;
    其他函数声明
}

3.5.2 内部类

class 外部类名
{
    外部类成员;
访问限定符:
    class 内部类名
    {
        内部类成员
    };
};

http://www.niftyadmin.cn/n/1107530.html

相关文章

shell习题第7题:备份数据库

【题目要求】 设计一个shell脚本用来备份数据库&#xff0c;首先在本地服务器上保存一份数据&#xff0c;然后再远程拷贝一份&#xff0c;本地保存一周的数据&#xff0c;远程保存一个月 假设我们知道mysql root账号的密码&#xff0c;要备份的库为data123&#xff0c;本地备份…

笔记本上无法运行redflag5.0桌面版(转)

笔记本上无法运行redflag5.0桌面版(转)[more]一笔记本,配置为:英特尔赛扬M处理器420 1.6G,60GSATA硬盘,512MDDR2内存,13.3寸 WXGA 镜面宽屏,主板集成英特尔945GM Express显示芯片,在安装redflag5.0桌面版中,采用从光盘引导无法正常进入图形安装模式,在检测硬件阶段不能通过,从提…

xss跳转代码_XSS(跨站脚本攻击)

XSS攻击流程1、攻击者将恶意代码注入到服务器中2、用户在没有防备的情况下访问服务器3、服务器将含有恶意代码的网页响应给客户端4、在客户端浏览器中触发恶意的JS代码XSS危害1、盗取各种用户账号2、窃取用户Cookie资料&#xff0c;冒充用户身份进入网站3、劫持用户会话&#x…

x86汇编语言实践(3)

0 写在前面 为了更深入的了解程序的实现原理&#xff0c;近期我学习了IBM-PC相关原理&#xff0c;并手工编写了一些x86汇编程序。 在2017年的计算机组成原理中&#xff0c;曾对MIPS体系结构及其汇编语言有过一定的了解&#xff0c;考虑到x86体系结构在目前的广泛应用&#xff0…

《C++程序设计教程》——初识STL

初识STL 标准模板库简称STL 8.1 STL简介 STL的内容从广义上讲分为三个主要部分&#xff1a;容器、迭代器、算法。 在C的标准中&#xff0c;STL被组织在13个头文件中&#xff1a;< algorithm>、< deque>、< functional>、< iterator>、< vector>…

python3定义全局变量_python3的全局变量和局部变量

局部变量 定义在函数体内部的变量称为局部变量 函数的形参也是局部变量 局部变量的作用范围只在声明该局部变量的函数体内 局部变量在函数调用时被创建&#xff0c;在函数调用完成后自动销毁 全局变量 定义在函数体外&#xff0c;模块内的变量称为全局变量 全局变量在所有函数体…

使用rp-pppoe拨号成功后不能上网的一件怪事。(转)

使用rp-pppoe拨号成功后不能上网的一件怪事。(转)[more]在redhat9.0中&#xff0c;安装新下载的rp-pppoe软件后&#xff0c;进行了拨号的相关设置&#xff0c;dns不写&#xff0c;服务器提供。使用pppoe-start命令后显示&#xff1a;..connected!表明拨号已经成功。在浏览器地址…

爬虫取中间文本_掌握这几个知识,零基础学爬虫技术不是异想天开

爬虫技术门槛不高&#xff0c;想要从头自学爬虫&#xff0c;“工欲善其事&#xff0c;必先利其器”&#xff0c;Python功能强大&#xff0c;语法简洁易上手&#xff0c;是网络爬虫的有力工具&#xff0c;建议用Python语言入手。韦世东&#xff0c;资深爬虫工程师&#xff0c;《…