继承与派生文档格式.docx
《继承与派生文档格式.docx》由会员分享,可在线阅读,更多相关《继承与派生文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
name<
”sex:
sex<
}//以上3行是操作代码
};
如果某个部门除了需要用到学号、姓名、性别以外,还需要用到年龄、地址等信息,当然可以重新声明另一个类:
intnum;
//这是数据成员
intage;
charaddr[20];
”age:
age<
”address:
address<
}
可以看到有相当一部分是原来已有的。
能否利用原有的类作为基础,再加上新的内容即可,以减少重复的工作量。
C++提供的“继承”机制就是为了解决这个问题。
一、派生类
派生类(也称子类)是C++提供继承的基础,也是对原来的类进行扩充和利用的一种基本手段。
C++派生类继承或修改原有类中的部分或全部方法,而且可以增加原来类中没有的新方法,以满足使用派生类的需要。
一个类可以继承另一个类的属性。
其中被继承的类叫做基类(Baseclass),继承后产生的类叫做派生类(Derivedclass)。
有时,也把基类称为“父类”,而把派生类称为“子类”。
可以把派生类看作基类的扩展,它提供了一种简单、灵活且有效的机制对基类进行利用和扩展。
派生类从基类中继承所有的公共部分,并可以增加数据成员和成员函数。
任何类都可以作为基类,一个基类可以有一个或多个派生类,一个派生类还可以成为另一个类的基类。
定义派生类的一般格式如下:
class派生类名:
[访问属性]基类名
{
...
};
其中:
(1)class是类定义的关键字,用于告诉编译器下面定义的是一个类。
(2)派生类名是新定义的类名。
(3)访问属性(也叫继承方式、访问权限、引用权限)是访问说明符,可以是private、public和protected之一。
默认值为private,派生类名和访问属性之间用冒号隔开。
派生类的访问控制由访问属性来确定,它按下述方式来继承基类的访问属性:
.如果访问属性为public,则基类的public成员是派生类的public成员;
基类的private成员是派生类的private成员;
基类的private成员对基类仍保持private属性。
.如果访问属性为protected,则基类的public和private成员均是派生类的protected成员;
基类的private成员对派生类仍保持private属性。
具体来说,基类中声明为protected的数据只能被基类的成员函数或其派生类的成员函数访问;
不能被派生类以外的成员函数访问。
.如果访问属性为private,则基类的public和protected成员都是派生类的private成员;
也就是说,当访问属性为private时,派生类的对象不能访问基类中以任何方式定义的成员函数。
(4)基类名可以有一个,也可以有多个。
如果只有一个基类,则这种继承方式叫做简单继承;
如果基类名有多个,则这种继承方式称为多重继承。
各个基类名之间用逗号隔开。
例:
在前面声明的基类stud的基础上声明一个派生类student:
classstudent:
publicstud//声明基类是stud
{private:
intage;
//新增加的数据成员
charaddr[30];
voiddisplay_1()//新增加的成员函数
{cout<
"
age:
address:
addr<
}
看第一行:
student是新建的类名;
stud是已存在的基类;
public用来表示基类stud中的成员在派生类student中的使用权限。
1、公用派生类
在声明一个派生类时将基类的引用权限指定为public的,该类称为基类的
公用派生类。
在公用派生类中,基类的公用成员和保护成员仍然成为派生类中公用成员
和保护成员,而基类的私有成员不能被派生类引用,即成为派生类“不可访问的成员”,只有基类的成员函数可以引用它。
classstud//声明基类是stud
//基类私有数据成员
voiddisplay()//基类公用成员函数
publicstud//声明一个公用派生类student,基类是stud
voidshow()//新增加的成员函数
//企图引用基类的私有成员,错误。
//引用派生类的私有成员,正确。
可以通过基类的公用成员函数来引用基类的私有成员,下面对派生类student的声明修改为:
例1
#include<
string.h>
iostream.h>
classstud//声明基类是stud
{private:
//基类保护数据成员
stud(intn,charnam[],chars)//定义基类构造函数
{num=n;
//给数据赋初值
strcpy(name,nam);
sex=s;
voiddisplay()
num="
name:
"
sex:
};
classstudent:
//派生类的私有数据
student(intn,charnam[],chars,inta,charad[]):
stud(n,nam,s)//派生类的构造函数
{age=a;
//在此处只对派生类新增加的变量初始化
strcpy(addr,ad);
voidshow()//新增加的成员函数
{display();
//引用基类的公用成员函数,允许
//cout<
num:
//引用基类的私有成员,错误
//引用派生类的私有成员,正确
voidmain()
{studaa(20001,"
Zhou"
'
F'
);
//定义基类的对象
studenta(10010,"
Wang_li"
f'
19,"
115BeijingRoad,Shanghai"
//定义派生类的对象
studentb(10011,"
Zhang_fun"
m'
21,"
231ShanghiRoad,Beijing"
//定义派生类的对象
a.show();
b.show();
//分别输出第一、第二两个学生的数据
a.display();
//从基类继承的公用成员函数
aa.display();
//a.age=18;
//外界不能引用派生类的私有成员,错误
//a.num=10020;
//外界不能引用基类的私有成员,错误
}
运行结果为:
num=10010
Wang_li
f
19
115BeijingRoad,Shanghai
num=10011
Zhang_fun
m
21
231ShanghiRoad,Beijing
num=20001
Zhou
F
2、私有派生类
在声明一个派生类时,将基类的引用权限指定为private的,该类称为基类的
私有派生类。
在私有派生类中,基类的公用成员和保护成员成为派生类中私有成员,基类
的私有成员成为派生类“不可访问的成员”,只有基类的成员函数可以引用它。
如果派生类声明首行改为
privatestud//声明一个私有派生类student,基类是stud
{display();
//基类的公用成员函数变成派生类的私有函数
voidmain()
{studenta;
//定义一个派生类的对象
//错误。
基类的公用成员函数变成派生类的私有函数
a.age=18;
外界不能引用派生类的私有成员
可以看到:
(1)不能通过私有派生类对象引用从基类继承过来的任何成员。
(2)在派生类的成员函数中不能访问基类的私有成员,可以访问基类的公用成员。
例2
{age=a;
//基类的公用成员函数变成派生类的私有函数,允许
//分别输出第一、第二个学生的数据
//a.display();
//基类的公用成员函数变成派生类的私有函数,企图引用,错误
3、保护成员
保护成员和private、public一样是用来声明成员的引用权限的。
由protected
声明的成员称为保护成员。
保护成员不能被外界引用(这点和私有成员类似),但它可以被派生类的成员函数引用。
从前面的介绍已知基类的私有成员被派生类(不论是私有派生类还是公用派生类)继承后变为“不可访问的成员”。
如果想在派生类引用基类的成员,可以将基类的成员声明为protected。
例3
{protected:
{num=n;
charaddr[30];
//引用基类的保护成员,合法
//从基类继承的公用成员函数,允许
//外界不能引用基类的保护成员,错误
10010
Wang_li
f
10011
Zhang_fun
m
将本例与例1-28对比分析,可以看到基类的保护成员对类的外界来说仍然是不可引用的(由于stud中的num是保护成员,外界不能用a.num来引用它),但对来说它相当于私有成员,可以通过成员函数引用。
也就是把保护成员的引用范围扩展到派生类中。
4、派生类的构造函数
派生类从基类继承了非私有成员函数和数据成员,但是在建立派生类的对象时,系统只执行派生类的构造函数,而不会自动执行基类的构造函数。
也就是说,基类的构造函数是不能继承的。
如果基类的构造函数包含对变量的初始化,那么在建立派生类的对象时,由于没有执行基类的构造函数,因而就会使基类的变量未初始化。
所以在设计派生类的构造函数时,不仅要考虑派生类所增加的变量初始化,还应当考虑基类的变量初始化。
在执行派生类的构造函数时,应当调用基类的构造函数。
例4:
派生类的构造函数
classstud//声明基类是stud
{protected:
~stud(){}//基类析构函数
{private:
//引用基类的保护成员,合法。
~student(){}//派生类析构函数
{
studentb(10011,"
//输出第一个学生的数据
//输出第二个学生的数据
num