C++ 面向对象三大特性:继承

19.类的继承

前面讲解了什么是面向对象程序设计,在设计类的代码时最重要的一个概念就是继承。继承允许我们依据一个已有的类来定义一个新类,这使得创建和维护一个应用程序变得更容易。这样编写代码,也达到了重用代码功能的效果。

19.1 基类与派生类

当创建一个新类时,并不一定要从零开始编写所有的数据成员和成员函数。如果这个类与其他的类有很强的联系,比如已有一个猫类了,再想写一个加菲猫类,只需要让新类去继承已有的类就能拥有这个类的所有数据和函数。

这个已有的类称为基类或父类,新建的类称为派生类或子类。

继承代表了 子类 也是 父类 的 关系。例如,哺乳动物类是动物类,猫类是哺乳动物类,猫类也是动物类。

19.2 继承的方式

下面我们来写个例子说明继承的方式,首先写个表示位置的结构体:

然后是Pawn父类,这个类有一些基本的数据和功能:

最后创建Character角色类并继承Pawn类:

继承关系的建立是在派生类的类名后面写上 :public Pawn,其中的public表明继承关系是公开的,公开继承会让基类成员的访问权限在派生类中保持不变。

除了公开的方式,继承还可以是protected 或 private的方式。

公开继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员。

保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。

私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。

虽然基类的私有成员不能直接被派生类访问,但是可以通过调用基类公有的或保护的成员函数来访问。

19.3 实例化子类对象

只要定义了派生类就可以在main函数中实例化派生类的对象了,实例化派生类对象需要调用基类的构造函数。也就是说实例化出来的派生类对象内部是包含一个基类对象的。如果是多重派生关系,那派生类中就会有多个基类对象被实例化出来。

在Pawn的构造函数中增加输出一句话表明Pawn的构造函数被调用了。

在Character类的构造函数中输出一句话表明Character的构造函数被调用了。

在main函数中去实例化一个Character类的对象。

运行可以看到基类和派生类的构造函数都被调用了,说明创建一个子类对象的同时也创建了一个基类对象。

如果基类有多个构造函数的情况下,派生类可以指明要选择使用基类的哪个构造函数。如果基类的构造函数需要参数,那调用时就要传入正确的参数。如果派生类没有指明使用基类的哪个构造函数,就会调用基类的默认构造函数。

19.4 派生类成员与基类成员

继承会让派生类拥有基类所有的代码,反过来却不成立。除了继承的代码,派生类还可以定义自己特有的属性和功能。

设计基类的成员时可以把派生类的共同属性和功能函数向上提升到基类中,这样就避免了在派生类中重复定义。

19.5 派生类对象的析构

当实例化派生类的对象时,系统会先调用基类的构造函数再调用派生类的构造函数。与实例化相反,当销毁一个派生类的对象时,系统会先调用派生类的析构函数再调用基类的析构函数。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();