关于继承的一些知识(C++)
当我们想要设计几个类分别记录老师,学生的个人信息时会发现,像姓名、地址、身份证号、电话等等记录基础信息的成员变量是都具有的,重复定义会显得冗余,但同时它们两者又具有不同的记录信息的成员变量,像学生需要记录学号,老师需要记录职称,以及不同的成员函数。
可以想个办法,比如将重复的部分单独拎出来,都写在一个类里,然后不同的部分就继承这个类成为一个类,这样的新类就叫做子类(派生类)
继承定义
访问限定符与继承方式一起,总共有9种组合方式
继承方式分为三种
public继承、protected继承、private继承
访问限定符分为三种
public访问、protected访问、private访问
不可见的意思是,基类的私有成员在派生类里是用不了的
但是有间接的方式,可以借助父类的公有成员函数进行使用
记忆方式:访问限定符 取 继承方式和基类的访问限定符小的那个
如果是class,不写继承方式默认就是私有继承
如果是struct,不写继承方式就是默认是公有继承
继承类模板
基类是模板需要实例化,按需实例化,不能直接使用,需要指定类域
因为当派生类实例化时,基类也会被实例化,但由于基类是模板类型,所以成员函数并未实例化,所以找不到
派生类可以是模板类或者非模板类
当是模板类时,派生类可以继承基类模板所以特化版本
当是非模板类时,派生类只能继承基类模板的某个特定实例,这种情况下,派生类在继承时需要指定基类模板的参数,实例化一个具体的基类
基类和派生类的转换
不同类型的对象进行赋值时,会因为类型不同发生类型转换,过程中会出现临时对象,所以引用加类型转换需要加上const(临时对象具有常性)
在public继承中,就有个特殊的例外,派生类对象可以直接赋值给基类的指针或者引用,而不需要加const,因为没有产生临时对象,给的直接是派生类里父类的那一部分
如果是赋值 父=子的形式,就是通过基类的拷贝构造或赋值重载完成,需要进行切割,将子类的自己定义的部分切掉
隐藏
派生类和基础类是可以有同名成员的,如果派生类有与基类函数名相同的成员函数(没有使用virtual关键字)或者相同名字的成员变量,基类的同名成员函数或成员变量将会被隐藏
这意味着在派生类对象上调用该函数时,将调用派生类中的版本,而不是基类中的版本。如果需要调用基类中的被隐藏函数,可以使用作用域解析运算符 ::
来显式指定调用基类中的函数。
派生类的默认成员函数
跟普通类的规则高度相似
分成两个部分分开处理:
1、基类成员(当成整体,调用基类构造)
2、派生类成员(跟普通类一样)
在C++中,当创建一个派生类的对象时,为了确保基类的成员被正确初始化,派生类的构造函数必须显式地调用基类的构造函数。这是因为构造函数不能被继承,所以派生类需要负责初始化其基类的部分
如果允许构造函数被继承,可能会导致初始化顺序的问题。派生类的构造函数需要在初始化派生类成员之前先初始化基类成员,如果构造函数可以被继承,那么这种初始化顺序将无法保证