1.继承的基本用法
当需要继承的时候,我们就在派生类的后面加上一个权限+父类,这个权限可以是公有,保护和私有,后面就是继承的父类.此时,下面的stu这个派生类,也就可以使用Person里面的方法了.
2.继承基类成员访问方式的变化
当父类被继承到派生类的时候,此时会根据继承方式的不同,而导致父类的不同类型数据访问的方式也可能会发生改变.
现在我们来罗列一下这些情况:
首先是父类里面的private成员,当这种成员被继承后,不论是公有继承,保护继承还是私有继承,他的访问权限就只是private;如果是父类里面的protected成员,则如果是公有继承和保护继承,则访问权限就是protected,如果是私有继承,则访问方式是private;最后如果是父类的公有数据,如果公有继承则访问权限则是public,如果是保护和私有继承,则分别是protected和private.
到这里,我们就可以很明显的看出一点规律.比如私有类的任意继承方式都是不可见的.如果说继承的权限小于父类数据的原有权限,则访问方式就是继承权限,如果等于,那就是继承权限/父类原有权限,如果大于,则是父类原有权限.
3.基类和派生类的对象赋值转换
对于对象之间的赋值和相互转换,我们知道,意义相近的类型,是可以相互之间进行转换和赋值的.比如int和double之间可以相互转换,单参数构造函数支持隐式类型转换(在隐式类型的转换中会产生临时变量,临时变量具有常性) , 那么基类和派生类之间 , 也可以相互赋值和转换吗?
在public继承的情况下,每一个子类都可以看作一个特殊的父类(is-a概念).在这种情况下的赋值,他叫做切割/切片赋值.他们的赋值转换之间并不会产生临时变量,这叫做切片赋值兼容.怎么证明?
如果说这里会产生临时变量的话,那么临时变量具有常性,我们因此需要在Person前面加一个const,但是这里不加const他都没有报错,因此这里并不会产生临时变量.
不管是对象也好,还是引用,或是指针,都是可以相互转换的.
4.继承中的作用域
1.在继承体系中基类和派生类都有着自己独立的作用域,这也就意味着,在基类和派生类里面,函数名是可以相同的,也可以定义同名成员.
2.子类和父类中如果有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义.
当基类和派生类都有一个叫_age的时候,此时调用st.Print()的话,就会就近原则的输出Stu的类.
一个在局部域,一个在全局域,则会有限输出局部域的变量.
局部域和全局域都会影响生命周期,访问.
在同一个作用域下,相同名字的函数会构成重载.
而对于这个父类和子类的构造函数和析构,如果是构造的话,则会先构造父类,后构造子类,而析构则会先析构子类,后析构父类