导航:
1、C++继承与派生
2、C++类的多继承
3、C++虚继承和虚基类
4、C++向上转型(Upcasting)
1、引用
引用可以看作是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。类似与绰号。
引用方式:类似与指针,只是用&代替*,语法格式为:
type &name = data;
int &b = a;//在定义的时候初始化
type 是被引用的数据的类型
name 是引用的名称
data 是被引用的数据
说明:引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其他数据,有点类似常量。
如果不希望通过引用来修改原始的数据,那么可以在定义时添加 const限制,形式为:
const type &name = value;
也可以是:
type const &name = value;
这种引用方式为常引用
在定义或声明函数时,我们可以将函数的形参指定为引用的形式,这样在调用函数时就会将实参和形参绑定在一起,让它们都指代同一份数据。
------------
-------一个能够展现按引用传参的优势的例子就是交换两个数的值
2、继承
继承是类和类之间的关系,与现实中的继承类似。
可以理解为一个类从另一个类获取成员变量和成员函数的过程。
class Student: public People{ }
其中要注意不要丢掉继承方式。如果不写,默认是private继承。
1) public继承方式
基类中所有 public 成员在派生类中为 public 属性;
基类中所有 protected 成员在派生类中为 protected 属性;
基类中所有 private 成员在派生类中不能使用。
2) protected继承方式
基类中的所有 public 成员在派生类中为 protected 属性;
基类中的所有 protected 成员在派生类中为 protected 属性;
基类中的所有 private 成员在派生类中不能使用。
3) private继承方式
基类中的所有 public 成员在派生类中均为 private 属性;
基类中的所有 protected 成员在派生类中均为 private 属性;
基类中的所有 private 成员在派生类中不能使用。
我们这里说的是基类的 private 成员不能在派生类中使用,并没有说基类的 private 成员不能被继承。实际上,基类的 private 成员是能够被继承的,并且(成员变量)会占用派生类对象的内存,它只是在派生类中不可见,导致无法使用罢了。private 成员的这种特性,能够很好的对派生类隐藏基类的实现,以体现面向对象的封装性。
3、using关键字
使用using关键字,可以改变基类成员在派生类中的访问权限。
using People::m_name;
直接在类里面用就好了。
4、名字遮蔽
如果派生类中的成员,(包括成员变量和成员函数) 和基类的成员重名,那么子类就会覆盖基类中的数据。需要使用基类中的函数,可以使用域名加两个冒号。
需要注意的是:基类成员和派生成员的名字一样时会造成屏蔽,即使是函数、不会构成重载。不管他们的参数是否一样。
5、 而且,需要知道的是:基类的构造函数也是不能继承的,因为没有意义,名字不一样。
虽然是继承过来的,但是对继承过来的数据的初始化工作是由派生类的构造函数完成的,但是大部分基类有private属性成员变量,他们无法在派生类中访问,更不能使用派生类的构造函数来初始化。------解决这个问题的思路是------在派生类的构造函数中调用基类构造函数。
6、构造函数的调用顺序
按照继承的层次自顶向下。
不能直接调用爷爷,也就是非直系。
事实上,通过派生类创建对象时必须要调用基类的构造函数,这是语法规定。
7、派生类的析构函数:
与构造函数类似,析构函数也不能被继承。
需要注意的是,析构函数的执行顺序和构造函数的执行顺序相反。即先执行派生类析构函数,再执行基类析构函数。
8、C++类的多继承
class D: public A, private B, protected C{
//类D新增加的成员
}
语法就是把多个基类用逗号隔开。
要在派生类的构造函数中调用多个基类的构造函数。
基类构造函数的调用顺序和和他们在派生类构造函数中出现的顺序无关,而是和声明派生类是基类出现的顺序相同。
9、C++虚继承和虚基类
菱形继承。比如:
A->B;
A->C;
B->D;
C->D;
这个时候,实际上D中有两份A的数据,一份是B中的,一份是C中的。
10、向上转型(转型就是赋值的意思)
类是一种数据类型,也可以发生数据类型准换,不过这种转换只有在基类和派生类之间才有意义。
向上转型非常安全,向下转型有风险。
向上转型会丢失数据 ,比如一个D继承了ABC,先在把D向上转型给A,会丢失BC的数据。向下转型,比如把A赋值给D的话,BC的东西无法赋给D,会出现错误。
1、C++继承与派生
2、C++类的多继承
3、C++虚继承和虚基类
4、C++向上转型(Upcasting)
1、引用
引用可以看作是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。类似与绰号。
引用方式:类似与指针,只是用&代替*,语法格式为:
type &name = data;
int &b = a;//在定义的时候初始化
type 是被引用的数据的类型
name 是引用的名称
data 是被引用的数据
说明:引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其他数据,有点类似常量。
如果不希望通过引用来修改原始的数据,那么可以在定义时添加 const限制,形式为:
const type &name = value;
也可以是:
type const &name = value;
这种引用方式为常引用
在定义或声明函数时,我们可以将函数的形参指定为引用的形式,这样在调用函数时就会将实参和形参绑定在一起,让它们都指代同一份数据。
------------
-------一个能够展现按引用传参的优势的例子就是交换两个数的值
2、继承
继承是类和类之间的关系,与现实中的继承类似。
可以理解为一个类从另一个类获取成员变量和成员函数的过程。
class Student: public People{ }
其中要注意不要丢掉继承方式。如果不写,默认是private继承。
1) public继承方式
基类中所有 public 成员在派生类中为 public 属性;
基类中所有 protected 成员在派生类中为 protected 属性;
基类中所有 private 成员在派生类中不能使用。
2) protected继承方式
基类中的所有 public 成员在派生类中为 protected 属性;
基类中的所有 protected 成员在派生类中为 protected 属性;
基类中的所有 private 成员在派生类中不能使用。
3) private继承方式
基类中的所有 public 成员在派生类中均为 private 属性;
基类中的所有 protected 成员在派生类中均为 private 属性;
基类中的所有 private 成员在派生类中不能使用。
我们这里说的是基类的 private 成员不能在派生类中使用,并没有说基类的 private 成员不能被继承。实际上,基类的 private 成员是能够被继承的,并且(成员变量)会占用派生类对象的内存,它只是在派生类中不可见,导致无法使用罢了。private 成员的这种特性,能够很好的对派生类隐藏基类的实现,以体现面向对象的封装性。
3、using关键字
使用using关键字,可以改变基类成员在派生类中的访问权限。
using People::m_name;
直接在类里面用就好了。
4、名字遮蔽
如果派生类中的成员,(包括成员变量和成员函数) 和基类的成员重名,那么子类就会覆盖基类中的数据。需要使用基类中的函数,可以使用域名加两个冒号。
需要注意的是:基类成员和派生成员的名字一样时会造成屏蔽,即使是函数、不会构成重载。不管他们的参数是否一样。
5、 而且,需要知道的是:基类的构造函数也是不能继承的,因为没有意义,名字不一样。
虽然是继承过来的,但是对继承过来的数据的初始化工作是由派生类的构造函数完成的,但是大部分基类有private属性成员变量,他们无法在派生类中访问,更不能使用派生类的构造函数来初始化。------解决这个问题的思路是------在派生类的构造函数中调用基类构造函数。
6、构造函数的调用顺序
按照继承的层次自顶向下。
不能直接调用爷爷,也就是非直系。
事实上,通过派生类创建对象时必须要调用基类的构造函数,这是语法规定。
7、派生类的析构函数:
与构造函数类似,析构函数也不能被继承。
需要注意的是,析构函数的执行顺序和构造函数的执行顺序相反。即先执行派生类析构函数,再执行基类析构函数。
8、C++类的多继承
class D: public A, private B, protected C{
//类D新增加的成员
}
语法就是把多个基类用逗号隔开。
要在派生类的构造函数中调用多个基类的构造函数。
基类构造函数的调用顺序和和他们在派生类构造函数中出现的顺序无关,而是和声明派生类是基类出现的顺序相同。
9、C++虚继承和虚基类
菱形继承。比如:
A->B;
A->C;
B->D;
C->D;
这个时候,实际上D中有两份A的数据,一份是B中的,一份是C中的。
10、向上转型(转型就是赋值的意思)
类是一种数据类型,也可以发生数据类型准换,不过这种转换只有在基类和派生类之间才有意义。
向上转型非常安全,向下转型有风险。
向上转型会丢失数据 ,比如一个D继承了ABC,先在把D向上转型给A,会丢失BC的数据。向下转型,比如把A赋值给D的话,BC的东西无法赋给D,会出现错误。