友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第15章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




   方式的。同样,C++允许我们使用运算符 “”来连接两 

   个字符串,但是,这样的重载方式不会给编程带来方 

   便,它们只会混淆程序员的思维,因此是应该避免的。  



            第三节 类的继承  



类的派生(derivation)和继承 (inheritance)是面向对象程序 

设计中的一个很重要的概念。通过这种被称作继承的机制, 

可以从已有的类派生出新的类,新的类包括了已有类的全部 

接口 (interface),而且还可以包括特有的新的接口,从而实 

现我们在2。1。3小节中提出的继承结构。本节讲述使用C++编 

程语言来实现继承机制的具体的语法细节。  



在C++中,若我们从类A派生出新的类B,那么,称类A为类B的 

基类 (base class),而类B为类A的派生类 (derived class)  



2。3。1 单一派生  



所谓的单一派生是指一个派生类只能有一个直接基类。什么 

叫直接基类呢?假设我们从类A派生出类B,然后又从类B派生 

出类C,那么,类B就是类C的直接基类,与之相对比,我们称 

类A为类C的间接基类。这一关系可以用图2。5表示。  


…………………………………………………………Page 86……………………………………………………………

                                         



                         图2。 5 单一继承结构  



下面的代码实现了上面的结构:  



class A  



{  



// 在此添加类A的实现  



// 。。。  



};  



class B:public A  



{  



// 在此添加类 B 特有的实现  



// 。。。  



};  



由上面的代码可以看出,类的单一派生使用如下的语法:  



class class…name : access…specifier base…class  



{  



// 派生类的新增成员  



};  



其中class…name是派生类的类名,access…specifier指定了 

基类的继承方式,可以使用的关键字包括public   (如前面的 

例子所示)、private和protected,它们的作用我们将在下面 

作说明,base…class是基类的类名。  



同指定类中的成员的访问权限相仿,我们可以使用访问限定 

关键字指定派生类对基类成员的访问权限。对于使用不同方 


…………………………………………………………Page 87……………………………………………………………

式 (public、private和protected)派生的类,对于基类中以 

不同方式 (public、private和protected)定义的成员的访问 

限制是不同的。我们在前面讲述类中成员的访问限制时已在 

前面的表2。2中已经给出了不同派生方式不区别,为了叙述方 

便,这里将与本节有关的内容重新列于表2。6。  



        表2。 6 不同派生方式得到的派生类对基类成员的访问权限  



    基类成员所使用的      在派生类中基类的继     派生类对基类成员访问 

        关键字           承方式             权限  



    public        public        相当于使用了public关 

    (公有成员)                      键字  



                  protected     相当于使用了 

                                protected关键字  



                  private       相当于使用了private 

                                关键字  



    protected     public        相当于使用了 

    (受保护成员)                     protected关键字  



                  protected     相当于使用了 

                                protected关键字  



                  private       相当于使用了private 

                                关键字  



    private       public        不可访问  

    (私有成员)  

                  protected     不可访问  



                  private       不可访问  



从表2。6可以看出,无论使用哪种方式生成的派生类,其成员 

函数都可以访问基类中除了以private关键进行限定的以外的 

其它成员。但是,对于以public方式生成的派生类,在基类 

中使用public和protected关键字限定的成员,在派生类中仍 

相当于使用了public和protected关键字;对于以protected 

方式生成的派生类,在基类中使用public和protected关键字 

限定的成员,在派生类中都相当于使用了protected关键字; 

而对于以private方式生成的派生类,它们都相当于使用了 

private关键字。  



  n 注意:  


…………………………………………………………Page 88……………………………………………………………

  n 无论使用的是哪种继承方式,在基类中以private关键字 

    进行限定的成员在派生类中都是不可以访问的,这和以 

    protected关键字定义的成员有着很大的 区别,因此,如 

    果希望成员能够为派生类所访问,而同时又不希望被类 

    外部的其它函数直接访问,那么应该使用的访问限定符 

    是protected,而不是private。  



    



2。3。2 多重继承  



前面说过,当一个派生类只有一个基类时,我们称这种继承 

方式为单一继承。事实上,在C++中,我们还允许一个派生类 

具有多于一个的基类,这种派生方式被称为多重继承 

(multiple     inheritance)。多重继承是单一继承的自然扩 

展,两者既有同一性,又有特殊性。图2。6给出了一个多重继 

承的示例。在这个示例中,类Software由两个类 

OperatingSystem和Application派生,而类puter又由类 

Software和另一个类Hardware派生。  



实现该示例的C++语言代码如下:  



                                                 



                    图2。 6 多重继承结构  



#include   



#include   



#include   



class OperatingSystem  



{  



private:  



char OsName'80';  


…………………………………………………………Page 89……………………………………………………………

public:  



const char *GetOsName() const  



{  



return OsName;  



}  



OperatingSystem()  



{  



}  



OperatingSystem(char *OsName)  



{  



strcpy(OperatingSystem::OsName;OsName);  



}  



};  



class Application  



{  



private:  



char *(AppName'80');  



char n;  



public:  



const char *GetAppName(int i) const  



{  



return AppName'i';  



}  



int AddAppName(char *AppName)  



{  



char *NewAppName=new char'80';  


…………………………………………………………Page 90……………………………………………………………

strcpy(NewAppName;AppName);  



Application::AppName'++n'=NewAppName;  



return n;  



}  



int GetAppCount()  



 {  



return n;  



}  



Application()  



 {  



n=0;  



}  



~Application()  



 {  



for (int i=1;i
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!