继承与多继承

继承

父类派生子类,这种关系称为继承

特性:

1、子类全盘接受父类的特性,出构造函数和析构函数外
2、对父类的成员方法、属性,进行修改,隐藏父类的成员方法

#include<iostream>
using namespace std;
class Base
{
public:
    Base()
    { cout<<"Create Base"<<endl;}
    ~Base()
    { cout<<"Free ~Base"<<endl;}
};
class D:public Base
{
public:
    D()
    { cout<<"Create D"<<endl;}
    ~D()
    { cout<<"Free ~D"<<endl;}
};

void main()
{
    //构造一个子类的对象,先调用父类的构造函数
    D d;
}

这里写图片描述

多继承

子类继承了多个基类的成员方法

1、根据子类的继承声明顺序构造
2、按照成员对象的声明顺序进行构造
3、构造自己对象

#include<iostream>
using namespace std;
class Base1
{
public:
    Base1()
    { cout<<"Create Base1"<<endl; }
    ~Base1()
    { cout<<"Free Base1"<<endl;}
};
class Base2
{
public:
    Base2()
    { cout<<"Create Base2"<<endl; }
    ~Base2()
    { cout<<"Free Base2"<<endl;}
};
class Base3
{
public:
    Base3()
    { cout<<"Create Base3"<<endl; }
    ~Base3()
    { cout<<"Free Base3"<<endl;}
};
//按照基类声明的先后顺序构造
class D :public Base1,public Base2,public Base3
{
public:
    D()
    { cout<< "Create D"<<endl;}
    ~D()
    { cout<<"Free  D"<<endl;}
//调用类的成员对象的构造函数时,按照声明顺序构造
private:
    Base3 b3;
    Base1 b1;
    Base2 b2;
};
void main()
{
    D d;
}

要求:

1、在继承类函数中,只要基类的构造函数不是使用缺省的构造函数,就要在子类中要显式的给出基类名和参数列表
2、基类中带有形参的构造函数,子类中也必须定义构造函数


#include<iostream>
using namespace std;
class Base1
{
public:
    Base1(int i=0):m_i(i)
    { cout<<"Create Base1"<<endl; }
    ~Base1()
    { cout<<"Free Base1"<<endl;}
private:
    int m_i;
};
class Base2
{
public:
    Base2(int j=0):m_j(j)
    { cout<<"Create Base2"<<endl; }
    ~Base2()
    { cout<<"Free Base2"<<endl;}
private:
    int m_j;
};
class Base3
{
public:
    Base3(int x=0):m_x(x)
    { cout<<"Create Base3"<<endl; }
    ~Base3()
    { cout<<"Free Base3"<<endl;}
private:
    int m_x;
};
class D :public Base1,public Base2,public Base3
{
public:

    //初始化列表时,基类名,成员对象名顺序可以随意
    //不能赋值,因为在调用子类构造函数之前必须调用基类构造函数
    D(int data):Base1(data),Base2(data),Base3(data),b1(data),b2(data),b3(data)
    //基类的构造函数不是使用缺省的构造函数,就要在子类中要显式的给出基类名和参数列表
    { cout<<"Create D"<<endl;}
    ~D()
    { cout<<"Free  D"<<endl;}
private:
    Base3 b3;
    Base1 b1;
    Base2 b2;
};
void main()
{
    //基类中使用缺省的构造函数时,子类可以不用写
    D d(10);
    //基类中带有形参没有带缺省值的构造函数,子类则必须书写构造函数
    D v(10);
}

这里写图片描述

总结

派生类构造函数各部分执行过程

1、调用基类构造函数,按照派生类声明的先后顺序,依次调用
2、调用成员对象的构造函数,按照类中声明的先后数必须,依次调用
3、派生类的构造函数体中的操作(构造子类自己的对象)
4、只要基类不是使用缺省构造函数,子类要显示给出基类名和参数列表
5、基类定义了带有形参的构造函数时,派生类必须定义构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值