C++复习(3):类的一系列操作.继承与派生

来源:互联网 发布:村淘再用淘宝客 编辑:程序博客网 时间:2024/05/29 03:08

类的继承与派生是类的重要用法,是C++语言面向对象特点的一大体现,此功能极大的减小了程序员的工作量,派生类除了基类的构造函数和析构函数以外都会继承,而继承方式则控制基类在派生类中的访问属性。
定义方式:
**class 派生类名: 继承方式 基类名
{ 派生类新增成员声明 } ;**

1.私有继承
基类中的公有成员和保护成员在派生类中变成了私有成员,而基类私有成员在派生类中无法被访问,因此在多重继承中私有成员完全不适用。
2.公有继承
基类中的所有成员在派生类中的访问属性不变。
3.保护继承
基类中的私有成员在保护继承的派生类中无法访问,其他类型成员变成保护类成员,在派生类外部无法访问类中的保护成员,保护继承适合用于多重继承。派生类的成员函数访问基类的保护成员是合法的。基类的保护成员对派生类的外界来说是不可访问的。

以上是类的继承的三种方式。

1.单一继承时的构造函数问题
在继承过程中由于构造函数无法进行继承,因此在派生类中需要单独对基类的构造函数进行调用。
举例:

#include<iostream>using namespace std;class A{private:int a;public:A(int n):a(n){}//基类的构造函数void display(){cout<<a<<endl;}//输出a};class B:public A{private:int b;public:B(int n,int m):**A(n)**,b(m){}//**在派生类中对基类构造函数单独调用**void display(){A:: display();cout<<b<<endl;//输出b}};int main(){B b(10,20);b.display();return 0;}

输出结果:
这里写图片描述

派生类构造函数调用顺序
①调用基类构造函数,初始化基类数据成员
②初始化派生类中定义的数据成员,按照定义顺序进行初始化
(注意这不是执行派生类构造函数里的语句)。
若在初始化列表中指定初始值,则按照此值初始化。
若没有在初始化列表中指定初始值,则会按照默认值初始化(默认构造函数)。
③执行派生类构造函数里的语句。
所有的派生类构造函数都遵守此顺序

2.多层继承中的构造函数

多层继承的构造函数调用其实就是单层继承构造函数的递归函数。

3.派生类的析构函数
派生的析构函数同样是递归调用的 调用顺序如下:
1:首先执行派生类自己的析构函数中的语句。
2:系统自动调用子对象的析构函数。(若有多个子对象,则按照与子对象定义顺序相反的顺序调用)
3:系统自动调用基类的析构函数,其调用顺序和派生类的调用顺序一致。

4.多重继承
一个派生类可以有多个不同的基类,这就是多重继承。

声明方式:
class 派生类名:继承方式1 基类名1,继承方式2 基类名2,…
{
成员声明;
}

由于多重继承可以有多个基类,例如类C的基类是类A和类B,而类A和类B又来自于同一个基类O,这其中就会有带来二义性。

C++为其设计了避免二义性的方法,定义虚基类这样类C中就只会有一个类O。

虚基类的声明方式:
class 派生类名:virtual 继承方式 基类名

举例:

class  O{… … };class  A: virtual public O{… … };class  B: virtual public O{… … };class C: public A,public B{};

在继承时将虚基类声明,这样在类C中就只有一个类O。

下面讨论一下多重继承的构造函数问题
构造函数的调用顺序和派生类对于基类的继承声明一致,虚基类的构造函数调用要求在虚基类的所有派生类(直接和间接)中,通过参数初始化表用虚基类的构造函数进行虚基类的初始化.

举例:

    class  O    {    private:    int o;    public:    O(int n)    {o = n;}    };    class  A: virtual public O    {    private:    int a;    public:    A(int n,int m):O(n),a(m){}    };    class  B: virtual public O    {    private:    int b;    public:    B(int n,int m):O(n),b(m){}    };    class C: public A,public B    {    private:            int c;    public:           C(int n,int m,int i):O(n),B(n,m),A(n,i){}//先对A进行构造再对B     };

这大概就是继承与派生的大致内容了。

2017年12月9日17:25:14
写于南京工程学院

原创粉丝点击