继承总结

一、类之间的关系
1.
Ø继承:已有类的基础上创建新类的过程
Ø 一个 B 类继承A类,或称从类A 派生类 B

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

2.

类继承关系的语法形式

  class派生类名: 基类名表

   {

        数据成员和成员函数声明

   };

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

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

      ●改造基类成员

      ●添加派生类新成员
4.重名成员

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

类名:: 成员

5.派生类中访问静态函数

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

  类名 :: 成员

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


6.基类的初始化

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

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

   … 对象成员n ( 变元表 )

Ø 构造函数执行顺序:基类 à 对象成员à 派生类
7.派生类构造函数和析构函数的使用原则
1.基类的构造函数和析构函数能被继承
2.如果基类没有定义构造函数有无参的构造函数, 派生类也可以不用定义构造函数
3.如果基类无参的构造函数,派生类必须定义构造函数
4.如果派生类的基类也是派生类,则每个派生类只负责直接基类的构造
5.派生类是否定义析构函数与所属的基类无关
8.派生类构造函数

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

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

     {

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

     }

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


9.派生类析构函数

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

n●在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。
10.多继承

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

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

    {

         数据成员和成员函数声明

    }


11.多继承的派生类构造和访问

Ø多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员。
Ø执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。

Ø一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别。
12.多继承方式下构造函数的执行顺序:

执行所有基类的构造函数

执行对象成员的构造函数

最后执行派生类的构造函数
13.多继承的析构函数

析构函数名同样与类名相同,无返回值、无参数,而且其定义方式与基类中的析构函数的定义方式完全相同。

功能是在派生类中对新增的有关成员进行必要的清理工作。

析构函数的执行顺序与多继承方式下构造函数的执行顺序完全相反,首先对派生类新增的数据成员进行清理,再对派生类对象成员进行清理,最后才对基类继承来的成员进行清理。  


14.

赋值兼容规则中所指的替代包括以下的情况:

  a 派生类的对象可以赋给基类对象

  b 派生类的对象可以初始化基类的引用

  c 派生类的对象的地址可以赋给基类类型的指针

15.赋值兼容的可行性

n通过公有继承,
n派生类得到了除了构造、析构函数以外的所有成员
n且这些成员的访问控制属性也和基类完全相同。
n这样,它便具备了基类的所有功能。
n 利用赋值兼容规则
na 派生类的对象可以赋给基类对象(强制类型转换)
nb 派生类的对象可以初始化基类的引用

nc 派生类的对象的地址可以赋给基类类型的指针
16.

(1) 可以用派生类对象给基类对象赋值。例如:

      Base b;

      Derived d;

      b=d;

         这样赋值的效果是,对象b中所有数据成员都将具有对象d中对应数据成员的值。

(2) 可以用派生类对象来初始化基类的引用。例如:

     Derived d;

     Base &br=d;

(3) 可以把派生类对象的地址赋值给指向基类的指针。例如:

   Derived d;

   Base *bptr=&d;

         这种形式的转换,是在实际应用程序中最常见到的。

(4) 可以把指向派生类对象的指针赋值给指向基类对象的指针。例如:

    Derived *dptr,obj; dptr=&obj;

    Base*bptr=dptr;

17.赋值兼容应注意的问题

1)声明为指向基类的指针可以指向它的公有派生类的对象,但不允许指向它的私有派生类的对象。例如:

    class B  {…}

    class Dprivate B  {…}

    B b1,*pblD d1

     pb1=&b1;        //合法,基类B的对象b1B类的指针

      pb1=&d1;        //非法,不允许将基类指针指向它的私有派生类对象

2)允许将一个声明为指向基类的指针指向其公有派生类对象,但是不能将一个声明为指向派生类对象的指针指向其基类的一个对象。

  (3)  声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类的定义的成员


e.g:

一个派生类对象也是一个基类对象,一个基类对象可派上用场的地方,派生类对象一样可派上用场。反之则不然。

class Person {…};

class Student : publicPerson { … };

void eat(Person &p){};

void study(Student&s){};

void main( )

{

  Person p;

  Student s;

  eat(p);  // OK

  eat(s);  // OK 学生也要吃饭

  study(s); // OK

  study(p); // error C2664: “study”: 不能将参数 1 从“Person”转换Student&”

}

感悟:继承的一个很大的好处就是避免了重复输入同样的代码多次,可以使得代码更加简洁明了,切容易操作。同时,在使用继承的时候要注意一些规则,避免出现编程错误。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值