继承
父类派生子类,这种关系称为继承
特性:
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、基类定义了带有形参的构造函数时,派生类必须定义构造函数