继承是面向对象编程的三个主要特征之一。继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。派生类只能有一个直接基类(结构不支持继承,但可以实现接口)继承是可以传递的。
定义一个类从其他类派生的时候,派生类隐式获得基类的除构造函数和析构函数以外的所有成员。所以派生类可以重用基类中的代码而无需重新实现。然后在派生类中添加新成员,来扩展基类的功能。
前面都是直接从msdn上抄过来的,对于构造函数能不能继承这一点感觉到很疑惑。在之前的理解中,一直以为构造函数是可以继承的,因为在实际操作中,把派生类中的默认构造函数删除掉的话,派生类也可以使用基类中的默认构造函数实例化。结果错误的以为这是继承。我想应该会有很多新手在学习继承的时候也会陷入这样的误区。所以在这里把自己的理解写一哈,希望能帮助到需要的人,再一个希望有大神看看我的理解有没有错。
实际上,我之前是把构造函数继承和调用搞混了。继承是一种关系,调用是一种行为。有继承关系的类的默认构造函数在调用的时候,总是先从基类开始,然后一层一层执行下去。比如说C类继承于B类,B类继承于A类。那么C类在使用没有参数的构造函数的时候,就会先从A类中的构造函数执行,然后执行B类中的构造函数,再执行C类中的构造函数。当基类没有构造函数,派生类也没有构造函数的时候,派生类新增成员的初始化工作由其他公有的函数来完成。如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造。
这点跟有参数的构造函数很相似,有参数的构造函数也是这样执行的。但是无参数的构造函数是隐式执行的,而有参数的构造函数需要显示使用Base关键字来调用基类的构造函数。
类型的成员或者是在该类型中声明的,或者是从该类型的基类“继承”的。当类型从基类继承时,基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都成为派生类型的成员。基类中关于成员的可访问性的声明不能控制该成员是否可继承:继承性适用于任何成员,只要它们不是实例构造函数、静态构造函数或析构函数。然而,在派生类中可能不能访问已被继承的成员,原因或者是因为其已声明可访问性,或者是因为它已被类型本身中的声明所隐藏。
派生类继承基类的所有成员(除构造函数和析构函数),new用来隐藏基类成员,override用来重写基类成员方法。然而隐藏和重写都不能改变一个事实:
基类的所有成员(实例构造函数、析构函数和静态构造函数除外)在派生类中一个也不能少。
网友评论