1.数据类型转换
C语言:(int)89.9;
c++ :int(89.9);
2.转换构造函数参数有且只有一个。
第五章 继承与派生
5.1继承与派生的概念
1.继承和派生是类间的一种常用关系。
继承,就是根据一个已存在的类建立一个新的类。新建立的子类从基类那里获得基类的特性,成为类的继承。派生,就是由基类产生新的子类。
继承类叫基类或父类,派生出来的新类叫子类,派生类。
2.单继承:子类只从一个基类继承。会形成一个树状结构。
多重继承:子类从多个基类继承。
5.2派生类的声明方式
1.class 派生类名:继承方式 基类名
{
private://派生类成员
public://派生类成员
protected;//派生类成员
};
派生类包含基类属性和派生类成员属性的综合属性。
此处student有person的功能和派生类的功能。
2.继承方式有三种:private(默认),public(最常用),protected;
派生类也可以被其他类继承。
构造函数和析构函数是不能继承的。
派生类自动具有基类的全部成员,但不具有基类的构造函数和析构函数。
5.3派生类的构成
1.派生类把基类的全部成员接收过来。(会造成冗余,浪费存储空间和执行效率)。
2.调整从基类接受的成员。(如何调整基类成员:通过指定不同的继承方式;通过在派生类中声明一个和基类成员同名的成员,可以覆盖接受的基类成员。)
3.构造函数和析构函数不能继承,需要在派生类中重新定义。
5.4派生类成员的访问属性
1.继承方式:
public;//公有继承(使用最多)
protected;//保护继承
private;//私有继承
2.基类的私有成员仍为基类私有,派生类新增成员不可直接访问它。基类的公用成员和保护成员在派生类中保持原有的访问属性。
可以在派生类中定义函数去访问基类的公有成员,再通过公有成员去访问私有成员(间接访问)。
3.私有继承时,基类的公有成员和保护成员成为派生类的私有成员;保护继承时,基类的公有成员和保护成员成为派生类的保护成员。两种情况中基类的私有成员都仍不能被派生类直接访问。
这里student类内可以直接访问基类的保护成员id,name。
小结:
4.公有成员:派生类内外都可以访问
保护成员:派生类内可以访问,派生类外不能访问,下一级派生也可以访问。
私有成员:派生类内可以访问,派生类外不能访问,下一级派生也不能访问。
不可访问成员:派生类内外都不可访问。
5.5 派生类的构造函数和析构函数
1.派生类不能继承基类的构造函数。
派生类构造函数任务:初始化派生类新增数据成员,给基类数据成员传递参数。
2.简单派生类的构造函数定义
派生类名(基类所需的形参,本类成员所需的形参):
基类名(参数列表)
{
初始化派生类新增数据成员语句;
}
例:
class person//基类
{
public:
person(int i,string nam)
{
id=i;
name=nam;
};
private:
int id;
string name;
};
class student:public person//派生类
{
public:
student (int i,string nam,int sid)://派生类构造函数
person(i,nam)
{
stuid=sid;
}
private:
int stuid;
};
参数初始化表
box(int h,int w,int len):height(h),weight(w),lenght(len){}//基类构造函数初始化
student(int i,string nam,int sid):person(i,nam){stuid=sid;}//派生类构造函数初始化
student(int i,string nam,int sid):person(i,nam),stuid(sid){}
3.构造函数执行顺序
先执行基类构造函数,然后调用子对象构造函数,再执行派生类自身构造函数。
4.有子对象的派生类的构造函数
(1)子对象:类的数据成员中包含的类对象,叫子对象。
(2)派生类构造函数任务:初始化
基类数据成员、子对象数据成员、派生类新增数据成员。
(3)派生类名(总参数表(形参)):
基类名(参数表列(实参)),子对象名(参数表列(实参)),
{派生类新增数据成员初始化语句;}
5.多层派生
当多称派生时,只需写出直接基类的构造函数即可。
派生类构造函数的函数体可以为空(派生类中没有新增数据时,等);
定义派生类构造函数时可以不写基类构造函数;
定义派生类时,可以不定义它的构造函数。
6.派生类的析构函数
(1)析构函数不能继承
(2)顺序
派生类,子对象,最后执行基类析构函数
7.多重继承
(1)允许一个派生类同时集成多个基类
class D:public A,private B,public C//D是从不同的基类,按照不同的继承方式继承而来的派生类
{
D新增成员
};
(2)多重继承派生类的构造函数格式
(3)派生关系中的二义性
单继承时父类和子类间重名成员的处理:对子类而言,不加类名限定时默认为子类成员;访问父类重名成员时,要通过类名限定。
8.多级混合继承
class A
class B:public A
class C: public A
class D:public B,public C;
D从两条不同的路径继承了A,D中同时包含了两个A的实例;访问时需要加类名限定来指明访问的哪一个A的实例。
9.虚基类
例:
class A
class B: virtual public A//B对A进行虚拟继承
class C: virtual public A//C对A进行虚拟继承
class D:public B,public C//在虚拟继承中,D只继承了A的一个实例
5.7基类和派生类的转换
1.不同类型数据之间的自动转换和赋值,叫赋值兼容。
2.只有公有派生类才是基类真正的子类型。(用private继承时,基类成员都变成了私有)
1.)派生类对象可以向基类赋值(大材小用)
赋值后,不能通过基类成员去访问派生类成员。
只能用子类对象对基类对象赋值。
同一基类的不同派生类对象之间也不能赋值。
2.)派生类可以向基类对象的引用进行初始化或赋值。
3.)如果函数的形参是基类对象或基类对象的引用,相应的实参可以用子类对象。
4.)派生类对象的地址可以付给指向基类对象的指针。(指向基类对象的指针变量也可以指向派生类对象)
5.8继承和组合
1.类的组合
1.)在一个类中,以另一个类的对象作为数据成员,叫类的组合。
2.继承和组合的区别
继承:派生类是基类的具体化表现。(派生类“是”基类)
组合:一个类包含另一个类。(一个类“有”另一个类)