目录
一,继承是什么?
二,继承的权限
三,继承赋值兼容规则
四,继承中的作用域
一,继承是什么?
我们说面向对象的语言有三大特性:1.封装,2,继承,3,多态。这里的继承便是面向对象的语言的三大特性之一。继承也像我们在日常生活中所理解的那样,继承便是儿子继承父亲的遗产然后自己用。
二,继承的权限
在C++语言中,我们有三大权限:1.private 2.protected 3.public。相信大家都知道这三大权限。继承也有三大权限,也是这三个权限。所以子类继承父类的对象的权限组合就会有九种。这九种组合如下:
虽然说这里有九种组合,但是我们的子类对象里继承父类的成员对象的权限只会有四种情况:
1.当父类中的权限是private时,子类中只会继承这个数据但是在子类中的这个成员或方法是不可见的。
2.当子类以private的权限来继承父类的成员或者方法时在子类中的该成员或者方法的权限也是private。在子类中可以访问继承而来的成员或者方法。
3.其它情况下,子类中继承而来的对象或者方法的权限大小取继承权限和父类中的对象或者方法权限的较小值。
如:
class parent { public : protected://父类中的成员权限为protected int a; int b; int c; }; class child :public parent//继承权限为public { public: int d; };
那么在子类中继承而来的父类成员权限就是min(public,protected) = protected。
三,继承赋值兼容规则
在这里我们要知道的便是:
1.子类对象可以赋值给父类对象但是父类对象不能赋值给子类对象 。
2.子类对象引用父类对象不需要加上const也可以引用
首先来解释第一个:
1.能得到第一个结论是因为子类对象一般都是大于或者等于父类对象的大小的,所以当我们用子类对象给父类对象赋值时子类对象里的成员个数是足够的,但是父类对象要赋值给子类对象的话成员的个数大概率是不够的。
2.我们都知道,当两个对象的类型不一样时比如一个int 型的对象a和double型的对象b:
在两者中间会生成一个叫做临时对象的东西来讲double类型的b改为int型然后再赋值给a。并且因为这个临时对象具有常性所以我们在使用引用时就要加上const才能引用:
但是对于具有继承关系的两个类型的对象我们便可以不用加上const,我们可以直接引用:
能实现这一点是因为在继承中有一个叫做《父子兼容规则》的设计让具有父子关系的两个对象在赋值时在中间不会产生一个临时对象。
四,继承中的作用域
1. 在继承关系中如果在父类与子类中的成员中如果有重名的在子类中会默认使用谁的呢?答案当然是要使用子类自己的。父类中的对象其实会被子类给隐藏掉,然后我们便只能使用子类自己的成员了。
2.在继承中如果子类与父类中的函数名相同相同参数不同能不能构成重载呢?答案是不能,因为构成重载的前提是在同一个作用域内。所以当父类与子类中的函数重名时父类中的函数在子类中也会被隐藏。
3.当父类与子类中都写了析构函数的话,即使这两个析构函数的名字是不一样的这两个析构函数在被编译以后也会拥有同一个名字叫做destroctor。也会构成隐藏关系。要使用的话就得显示使用:parent::~parent()。但是编译器其实会为我们主动调用父类的析构函数,所以我们只需要使用子类的析构函数便可以了。
4.父类成员的构造必须显示的调用父类的构造函数来实现。