C++类的继承与派生
Posted liuzhenbo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类的继承与派生相关的知识,希望对你有一定的参考价值。
C++中,继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为基类,又称父类;新建立类称为派生类,又称为子类。
基类是对派生类的抽象,派生类是对基类的具体化。
(一)派生类的定义与构成
1)派生类的定义
class 派生类名:类派生列表
成员列表
;
类派生列表指定了一个或多个基类,形式如下:
访问权限标号 基类名1,访问权限标号 基类名2,...
2)派生类的构成
派生类由两部分组成:第一部分是从基类继承得到的,另一部分是自己定义的新成员,这些成员仍然分为三种访问属性。
注意,友元关系是不能继承的:一方面,基类的友元对派生类成员没有特殊的访问权限;另一方面,如果基类被授予了友元关系,则只有基类有特殊访问权限,该基类的派生类不能访问授予友元关系的类。
实际编程中,设计一个派生类包括三个方面工作:
a)从基类接收成员。
除了构造函数与析构函数之外,派生类会把基类的全部成员继承过来。
b)调整基类成员的访问。
程序员可以对接收的成员指定访问策略。
c)在定义派生类时增加新的成员。另外还应该自己定义派生类的构造函数和析构函数,因为它们不能从基类继承过来。
(二)派生类成员的访问
不同的继承方式决定了基类成员在派生类中的访问属性
1)公有继承
基类的公有成员和保护成员在派生类中保持原有访问属性,私有成员仍为基类所有。
2)私有继承
基类的所有成员在继承类中为私有成员。
3)保护继承
一般地,保护继承与私有继承在实际编程中极少使用,它们只在技术理论上有意义。
在公有继承中,派生类成员可以访问继承的基类的public部分与protected部分,但是不能访问private部分。只有基类成员以及基类的友元可以访问private部分。
无论采用何种继承方式得到的派生类,派生类成员及其友元都不能访问基类的私有成员。
(三)赋值兼容性规则
赋值兼容规则是指在需要基类对象的任何地方,都可以使用共有派生类的对象来替代。通过公有继承,派生类得到了基类中除了构造函数与析构函数之外的所有成员。这样共有派生类实际就具有了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。
class Base; //基类
class Derive:public Base; //公有派生类
Base b,*pb; //定义基类对象,指针
Derive d; //定义派生类对象
赋值兼容性规则中所指的替代包括如下情况。
(1)派生类的对象可以赋值给基类对象;
b=d; //派生类对象赋值给基类,复制基类继承部分
(2)派生类的对象可以初始化基类的引用;
Base &rb=d; //基类引用到派生类对象
(3)派生类对象的地址可以赋值给指向基类的指针。
pb=&d; //基类指针指向派生类对象
(四)派生类的构造和析构函数
1)构造函数
派生类的构造函数定义形式如下:
派生类名站(形式参数列表):基类名(基类构造函数实参列表),派生类初始化列表
例子:
class Pointint x,y;
public:Point(int a,int b):x(a),y(b) //基类构造函数
;
class Rect:public Point int h,w;
public :Rect(int a,int b,int c,int d):Point(a,b),h(c),w(d) //派生类构造函数
如果基类有默认构造函数,或者参数全部都是默认参数的构造函数,那么派生类的构造函数中可以不显式初始化子对象。编译器会调用基类的构造函数进行初始化。
2)组合关系的派生类的构造函数
包括多个子对象的派生类的构造函数定义为:
派生类名(形式参数列表):基类名(基类构造函数实参列表),
子对象名1(子对象1所属类的构造函数实参列表)
...
派生类初始化列表
派生类初始化函数体
;
3)析构函数
在执行派生类的析构函数时候,系统会自动调用基类的析构函数与子对象的析构函数,对基类和子对象进行处理。
(五)多重继承
C++支持一个派生类同时继承多个基类。
多重继承派生类的定义:
class 派生类名:访问标号1 基类名1,访问标号2 基类名2,...
成员列表
;
多重继承构造函数:
多重继承派生类的构造函数形式与单一继承时的构造函数形式基本相同,只是在派生类的构造函数初始化列表中调用调用多个基类构造函数。一般形式为:
派生类名(形参列表):基类名1(基类1构造函数实参列表)
基类名2(基类2构造函数实参列表)
...
子对象名1(子对象1所属类的构造函数实参列表)
...
派生类初始化列表
派生类初始化列表
;
以上是关于C++类的继承与派生的主要内容,如果未能解决你的问题,请参考以下文章
C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承
C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承