C++ 第八章 继承

Ø   继承: 已有类 的基础上 创建新类 的过程
Ø   一个 B 类继承 A 类,或称从类 A 派生类 B

     A 称为基类(父类),类 B 称为派生类(子类)

类继承关系的语法形式

  class 派生类名 : 基类名表

   {

        数据成员和成员函数声明

   };

访问控制 表示派生类对基类的继承方式,使用关键字:

    public  公有继承

   private    私有继承

    protected  保护继承

派生类的生成过程经历了三个步骤:

       ●吸收基类成员(全部吸收(构造、析构除外),但不一定可见

       ●改造基类成员

       ●添加派生类新成员

对于下面的继承关系:

 

class Father

{

  int a,b;

public:

 // 成员函数

};

 

class Son:public Father

{

  int c;

public:

  // 成员函数

};

 

#include <iostream>

using namespace std;

class A{

public:

  int a;

  int b;

private:

  int c;

protected:

  int d;

};

class B: public A

{        int c;      };

main( ){

  cout << ” size of A is” << sizeof(A);

  cout << ” size of B is” << sizeof(B); }

 

 

Ø 派生类定义了与基类同名的成员,在派生类中访问同名成员时 屏蔽( hide 了基类的同名成员
Ø 在派生类中使用基类的同名成员,显式地使用类名限定符:

类名 :: 成员

例:

class  base

  { public :

           int  a ,  b

  } ;

class  derived : public  base

  { public : 

         int  b ,  c ;

  } ;

void  f ()

{ derived  d ;

   d . a = 1 ;

   d . base :: b = 2 ;

   d . b = 3 ;

   d . c = 4 ;

};

#include<iostream>  //8-4

using namespace std ;

class A

{ public:   

       int a1, a2 ;

      A( int i1=0, int i2=0 ) { a1 = i1; a2 = i2; }

      void print()

         { cout << "a1=" << a1 << '\t' << "a2=" << a2 << endl ; }

};

class B : public A

{ public: 

       int b1, b2 ;

       B( int j1=1, int j2=1 ) { b1 = j1; b2 = j2; }

       void print()  //定义同名函数

         { cout << "b1=" << b1 << '\t' << "b2=" << b2 << endl ; }

 void printAB()

        { A::print() ;  //派生类对象调用基类版本同名成员函数

           print() ;  //派生类对象调用自身的成员函数

       }

};

int main()

{ B  b ;        b.A::print();  b.printAB();  }

 

Ø 基类定义的静态成员,将被所有派生类共享(基类和派生类共享基类中的静态成员)
Ø 根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
Ø 派生类中访问静态成员,用以下形式显式说明:

  类名 :: 成员

    或通过对象访问  对象名 . 成员

Ø 在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据
Ø  派生类构造函数声明为

派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 )

   … 对象成员n ( 变元表 )

Ø 构造函数执行顺序: 基类 à 对象成员 à 派生类

派生类构造函数和析构函数的使用原则

1. 基类的构造函数和析构函数 能被继承
2. 如果基类 没有定义构造函数 有无参的构造函数 , 派生类也 可以不用 定义构造函数
3. 如果基类 无参的构造函数 ,派生类 必须 定义构造函数
4. 如果派生类的基类也是派生类,则每个派生类 只负责直接 基类的构造
5. 派生类是否定义析构函数与所属的基类无关

    

     C++,派生类构造函数的一般格式为:

      派生类::派生类名(参数总表):基类名(参数表)

     {

             // 派生类新增成员的初始化语句

     }

     注意:这是基类有构造函数且含有参数时使用

n 1 )当派生类中不含对象成员时
n ●在创建派生类对象时 , 构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
n ●在撤消派生类对象时 , 析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
n 2 )当派生类中含有对象成员时
n ●在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
n ●在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。

 

class B

{

public:

    B() { cout<<"B()"<<endl; }

    ~B() { cout<<"~B()"<<endl; }

};

class D : public B

{

public:

    D(){ cout<<"D()"<<endl; }

    ~D() { cout<<"~D()"<<endl; }

};

int main()

{

    D d;

    return 0;

}

多继承:

Ø  一个类有多个直接基类的继承关系称为 多继承
Ø   多继承声明语法

class  派生类名 : 访问控制  基类名1访问控制  基类名2 ,  … , 访问控制  基类名n

    {

         数据成员和成员函数声明

    }

Ø 多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员。
Ø 执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。
Ø 一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。
 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值