[C++]继承和派生类

继承和派生类

继承性是面向对象程序设计中最重要的机制。这种机制提供了无限重复利用程序资源的一种途径。通过C++语言中的继承机制,可以扩充和完善旧的程序设计以适应新的需求。这样不仅可以节省程序开发的时间和资源,并且为未来程序增添了新的资源。

class Student

{   int num;

    char name[30];

    char sex;

 public:                             

   void display( )                    //对成员函数display的定义

    {cout<<"num: "<<num<<endl;

     cout<<"name: "<<name<<endl;

     cout<<"sex: "<<sex<<endl; }

};

class Studend1

{    int num;          //此行原来己有

     char name[20];       //此行原来己有

     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;}                 

}; 

利用原来定义的类Student作为基础,再加上新的内容即可,以减少重复的工作量。 C++提供的继承机制就是为了解决这个问题。

在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类(base class)”或“父类(father class)”。新建立的类称为“派生类(derived class)”或“子类(son class)”。

class Student1: public Student//声明基类是Student

{private:

      int age;    //新增加的数据成员

    string addr;  //新增加的数据成员

public:

   void display_1( )  //新增加的成员函数

   {  cout<<"age: "<<age<<endl;

   cout<<"address: "<<addr<<endl;

}   

};

类A派生类B:类A为基类,类B为派生类。

 

在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。

通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。

在建立派生类的过程中,基类不会做任何改变,派生类则除了继承基类的所有可引用的成员变量和成员函数外,还可另外定义本身的成员变量和处理这些变量的函数,由于派生类可继承基类的成员变量和成员函数,因此在基类中定义好的数据和函数等的程序代码可重复使用,这样可以提高程序的可靠性。

当从已有的类中派生出新的类时,可以对派生类做以下几种变化:

1、 可以继承基类的成员数据或成员函数。

2、可以增加新的成员变量。

3、可以增加新的成员函数。

4、可以重新定义已有的成员函数。

5、可以改变现有的成员属性。

在C++中有二种继承:单一继承和多重继承。当一个派生类仅由一个基类派生时,称为单一继承;而当一个派生类由二个或更多个基类所派生时,称为多重继承。

 

类A派生类B:类A为基类,类B为派生类。

 

但派生并不是简单的扩充,有可能改变基类的性质。

有三种派生方式:公有派生、保护派生、私有派生。

默认的是私有派生。

从一个基类派生一个类的一般格式为:

class  ClassName:<Access>BaseClassName

{

       private:  

        ......; //私有成员说明

       public:  

        ......; //公有成员说明

       protected:  

        ......; //保护成员说明

  }

public: 表示公有基类

private:表示私有基类(默认)

protected:表示保护基类

ClassName:派生类名

Access:继承方式

BaseClassName:基类名

 

公有派生

class  ClassName:   public BaseClassName

public:公有派生,派生类中保持基类的成员特性

公有派生时,基类中所有成员在派生类中保持各个成员的访问权限。

 

基类:public:   在派生类和类外可以使用

  protected: 在派生类中使用

  private: 不能在派生类中使用

 

保护派生

class  ClassName:   protected  BaseClassName

protected:保护派生,派生类中基类公有和保护成员降级使用

保护派生时,基类中公有成员和保护成员在派生类中均变为保护的和私有的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。

protected 成员是一种具有血缘关系内外有别的成员。它对派生类的对象而言,是公开成员,可以访问,对血缘外部而言,与私有成员一样被隐蔽。

 

抽象类与保护的成员函数

当定义了一个类,这个类只能用作基类来派生出新的类,而不能用这种类来定义对象时,称这种类为抽象类。当对某些特殊的对象要进行很好地封装时,需要定义抽象类。

将类的构造函数或析构函数的访问权限定义为保护的时,这种类为抽象类。

当把类中的构造函数或析构函数说明为私有的时,所定义的类通常是没有任何实用意义的,一般情况下,不能用它来产生对象,也不能用它来产生派生类。

 

 

多重继承

可以用多个基类来派生一个类。

 

格式为:

class  类名:<Access>类名1,..., <Access>类名n

{

      private:     ...... ;   //私有成员说明;

      public:      ...... ;   //公有成员说明;

      protected:   ...... ;   //保护的成员说明;

};

class  D: public  A, protected B, private C

{    ....//派生类中新增加成员

};

 

初始化基类成员

构造函数不能被继承,派生类的构造函数必须调用基类的构造函数来初始化基类成员基类子对象。

派生类构造函数的调用顺序如下:

基类的构造函数

子对象类的构造函数

派生类的构造函数

class B:public A{

         int  y;                                   基类的构造函数

         A  a1;                                   子对象类的构造函数

public:                                            派生类的构造函数

         B(int a, int b):A(a),a1(3){y=b;}

         .......

};

当撤销派生类对象时,析构函数的调用正好相反。

 

基类与对象成员

任一基类在派生类中只能继承一次,否则,会造成成员名的冲突

若在派生类中,确实要有二个以上基类的成员,则可用基类的二个对象作为派生类的成员。

把一个类作为派生类的基类或把一个类的对象作为一个类的成员,在使用上是有区别的:在派生类中可直接使用基类的成员(访问权限允许的话),但要使用对象成员的成员时,必须在对象名后加上成员运算符“.”和成员名。

在平面上作两个点,连一直线,求直线的长度和直线中点的坐标。

基类为Dot,有两个公有数据成员,即平面上的坐标(x,y),同时有构造函数及打印函数。

派生类为Line,有两个基类Dot对象,分别存放两点的坐标,同时,从基类继承了一个Dot数据,存放直线中点的坐标。

再次强调,用虚基类进行多重派生时,若虚基类没有缺省的构造函数,则在每一个派生类的构造函数中都必须有对虚基类构造函数的调用 (且首先调用)。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值