1 继承与派生的概念
面向对象技术强调软件的可重用性。在C++中可重用性是通过“继承”这一机制来实现的。因此,继承是C++的一重要组成部分。
前面介绍了类,一个类中包含了若干数据成员和成员函数。每一个类的数据成员和成员函数是不相同的。但有时两个类的内容基本相同或有一部分相同。例如前面我们声明了学生基本数据的类stud:
class stud
{private;
int num;
char name[10];
char sex;
public;
void display ( ) //对成员函数 display的定义
{cout<<"num:"<<hum<<endl;
cout<<"name: "<<name<<endl;
cout<<*sex: "<<sex<<endl;}
}:
如果学校的某部门除了需要用到学号、姓名、性别以外,还需要用到年龄、地址等信息,当然可以重新声明另一个类:
class stud 1
{private:
int num; //此行原来已有
char name[10]; //此行原来已有
char sex; //此行原来已有
int age;
char addr[20];
public:
void display(): //此行原来已有
{cout<<"num:"<<num<<endl; //此行原来已有
cout<<"name:"<<name<<endl; //此行原来已有
cout<<"sex:"<<sex<<endl; //此行原来己有
cout<<"age:"<<age<<endl;
cout<<"address:"<<addr<<endl;}
};
可以看到有相当一部分是原来已有的。很多人自然会想到能否利用原有声明的类作为基础,再加上新的内容即可,以减少重复的工作量。C+十提供的“继承”机制就是为了解决这个问题。
先举一个日常生活中的例子来说明此问题。如果已经定义了“马”的特征,现在需要说明什么是“公马”,只需在“马”的特征的基础上增加“雄性”这一特征即可,不必从头说明什么是马。如果想进一步说明什么是“白色的公马”,只需在“公马”的基础上再增加说明“颜色是白的”即可。也就是说:“公马”继承了“马”的全部特征,加上“雄性”的新特征。“白公马”继承了“公马”的全部特征,再增加“白色”的特征。而“公马”是“马”派生出来的一个分支,“白公马”是“公马”派生出来的一个分支。见图15.4示意。
在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类(好比“马”)称为“基类”或“父类”。新建立的类称为“派生类”或“子类”。见图15.5示意。派生类继承了基类的所有数据成员和成员函数,并增加新的成员。
2 建立派生类的方法
先通过一个例子说明怎样通过继承来建立派生类。
例15.4通过继承来建立派生类。
假设已经声明了一个基类stud(见前面的介绍),在此基础上声明一个派生类
student:
class student: public stud //声明基类是stud
{
private:
int age; //新增加的数据成员
char addr[30]; //新增加的数据成员
public:
void display_1() //新增加的成员函数
{cout<<"age:"<<age<<endI;
cout<<"address:"<<addr<<endl;}
};
仔细观察第一行:
class student: public stud
在class 后面的student是新建的类名。冒号后面的stud表示是已存在的基类。在stud之前有一关键字public,用来表示基类stud 中的成员在派生类student中的使用权限。基类名前面有public 的称为“公用派生类”。其含义将在稍后讨论。
请读者仔细阅读以上声明的派生类student和上一节中给出的基类stud,并将它们放在一起进行分析。
定义派生类的一般形式为
class 派生类名:[引用权限]基类名
{
派生类新增加的数据成员
派生类新增加的成员函数
};
“引用权限”可以是private(私有的)和public(公用的)。引用权限可以不写,此时系统默认它为private。
派生类包括基类成员和自己增加的成员,派生类的成员函数在引用派生类自己的数据成员时,按前面介绍过的规则处理(即私有数据成员只能被同一类中的成员函数引用,公用成员可以被外界引用),而对从基类继承来的成员的引用并不是简单地把基类的私有成员和公用成员直接作为派生类的私有成员和公用成员,而要根据基类成员的引用权限和派生类声明的引用权限共同决定。下面将分别介绍。
3公用派生类
在声明一个派生类时将基类的引用权限指定为public的,该类称为基类的公用派生类。
在公用派生类中,基类的公用成员和保护(protected)成员仍然成为派生类中的公用成员和保护成员,而基类的私有成员不能被派生类引用,即成为派生类“不可访问的成员”,只有基类的成员函数可以引用它。基类的成员在公用派生类中的引用权限见表15.1。
表15.1公用派生类的继承关系
基类 | 私有成员 | 公共成员 |
公用派生类 | 不可访问的成员 | 公共成员 |
例15.5访问基类成员。
class stud //声明基类
{private : //基类私有成员
int num;
char name[10];
char sex;
public: //基类公用成员
void display ( )
{cout<<"num: "<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;}
};
class student: public stud //声明一个公用派生类
private:
int age;
char addr[30];
public:
void show( )
{ cout<<"num; "<<num<<endl; //企图引用基类的私有成员,错误。
cout<<"name: "<<name<<endl; //企图引用基类的私有成员,错误。
cout<<"sex; "<<sex<<endl; //企图引用基类的私有成员,错误。
cout<<"age; "<<age<<endl; //引用派生类的私有成员,正确。
cout<<"address:"<<addr<<endl) //引用派生类的私有成员,正确。
由于基类的私有成员对派生类来说是不可访问的,因此在派生类中的show函数中直接引用基类的私有数据成员num ,name和sex是不允许的。可以通过基类的公用成员函数来引用基类的私有数据成员。上面对派生类student的声明可改为
class student : public stud //声明一个公用派生类
{
private:
int age;
char addr[20];
public:
void show ( )
{display(); //引用基类的公用成员函数,允许,
cout<<"age:"<<age<<endI: //引用派生类的私有成员,正确。
cour<<"address: "<<addr<<endl;) //引用派生类的私有成员,正确。
};
在派生类成员函数show中引用基类的公用成员函数display,通过display引用基类 stud 中的私有数据 num,name 和sex。可以这样写main函数(假设对象a中已有数据}:
void mam ()
{student a: //定义一个student派生类的对象a
...
a. show(); //输出a对象的5个数据
请分析在主函数中能否出现以下语句:
n. display(); //正确。从基类继承的公用成员函数
a. age=18; //错误。外界不能引用派生类的私有成员
a.num=10020; //错误。外界不能引用基类的私有成员
标签:cout,派生,继承,成员,基类,公用,stud,派生类 From: https://blog.csdn.net/office_lgirl/article/details/137116593