1)C++入门级小知识,分享给将要学习或者正在学习C++开发的同学。
2)内容属于原创,若转载,请说明出处。
3)提供相关问题有偿答疑和支持。
说起继承主要关注的是防控属性的使用范围:
看一下下面的例子:
从上面的例子可以看出基类A中的三个int型变量分别被设置成public/protected/private
public:基类可以访问,子类也可以访问
protected:基类可以访问子类也可以访问
private:只允许基类可以访问
因此对于单个继承来讲public/protected/private不会约束子类的访问权限,即使是如:
class D:private A,D从A私有继承,同样可以访问public以及protected部分;
但是如果B、C、D的子类试图通过B、C、D基类去访问A的话就会受到防控限定:
因此对于继承的防控属性来讲只针对子类尝试通过父类去访问父类的基类才起作用,否则就不管子类怎么继承父类都不受防控属性约束;
对于子类继承基类的初始化方式:
为了能够在子类中访问基类的成员:
继承的基本使用:
上面可以看出在继承中父子类中相同的函数会存在隐藏的原则,子类会自动隐藏父类中的同名函数;如果我们就是想要访问基类中的话,我们可以加一个作用域限定符:stu.Human::print();
关于父子类的另外一个问题是:
指向子类的父类指针和指向基类的子类指针:
另外一个主意的问题是,一个基类的指针指向子类的对象,当delete基类指针的时候只会释放基类的析构,而子类的析构不会被调用,如下:
运行如下:
发现只是析构了Base,原因是编译器只认类型,看不到对象,因为释放的是Base*的对象,因此只是释放Base里面的析构;
解决这个问题的办法是用到了多态来实现:(虚析构)
将Base中的析构函数设置成虚函数,这样当用一个基类的指针或者是引用去调用虚函数实际会调用到子类中,根据这个可解决这个问题:
多重继承:一个类可以从多个基类中继承,如下:
对于继承中的拷贝构造以及拷贝赋值:
遵守一般的拷贝构造以及拷贝赋值运算,同样存在深拷贝,浅拷贝的问题;
对于继承的关系是:
当基类中函数申明了virtual以后,当子类中的函具有相同类型的覆盖函数,基类指针可以访问到子类中的函数;
当子类中没有雨基类相同类型的覆盖函数,那么基类指针只能访问基类自身的函数,此时基类中virtual关键字没意义;
当子类中的与基类具有相同类型的覆盖函数,但是此函数也是虚函数的话,此时基类指针依然可以访问到子类对象中的虚函数,与普通的函数访问意义一致;这也印证了一句话,函数的隐藏是针对函数名以及形参列表而言;