C++(day 3) 多态性 类型兼容性 静态联编 动态联编

1. 多态性的定义

定义: 在程序中同一符号或名字在不同情况下具有不同解释的现象称为多态性。

1.1 编译时多态

定义: 指在编译阶段即可确定下来的多态,主要通过重载机制获得。

1.2 运行时多态

定义: 指必须等待程序运行时才可确定的多态性,主要是通过继承结合动态绑定获得。要产生运行时多态必须先设计一个类层次(继承/派生),然后在某些类中使用虚函数。

2. 类型兼容性

  1. 赋值运算的类型兼容——如何一个对象赋值给另一个对象
    -两个不同类的对象一般是不能互相赋值的,但两个具有公有继承关系的对象可赋值
    -在面向对象程序设计中,类型的赋值兼容性规则允许将后代类的对象赋值给祖先类的对象,但反之不成立。此时被赋值的基类只能访问基类的公有成员,不能访问派生类中新增的成员。
  2. 参数传递的类型兼容——如何将一个实参传递给形参
  3. 对象初始化的兼容——如何用一个已知的对象初始化另一个对象

2.1 基类对象与派生类对象的关系

CPoint point;			//point为基类对象
CRect rect;				//rect为派生类对象
point = rect;			//O.K,派生类对象可以赋值给基类对象
rect = point;			//erroe,基类对象不能直接赋给派生类对象
(CPoint) rect = point;	//O.K,派生类对象经过显示类型转成基类对象
rect = (CRect)point;	//error,基类对象不能显示转换成派生类对象

-子类对象能直接转换为基类对象,基类对象不能直接转换为子类对象。
-具有私有继承和保护继承关系的对象间不可互相赋值

2.2 基类对象指针与派生类对象指针的关系

  1. 两个不同类类对象的指针一般不能相互赋值
  2. 若指针指向的两个对象具有公告继承关系,则:
    -派生类对象指针或引用可以赋值给基类对象指针或引用,反之则不然。此时被赋值的基类对象指针只能访问基类的公有成员,而不能访问派生类中新增的成员。
    -可用类型转换符将基类指针显示转换为指向派生类的指针来访问派生类的公有成员。
  3. 具有私有继承和保护继承关系的两个类类对象指针不可互相赋值

3. 静态联编与动态联编

  1. 静态联编:一般成员函数在调用时,在编译阶段被调用函数的代码地址已经时确定的并插入到可执行代码中。
  2. 动态联编:根据目录对象的动态类型(而不是静态类型)在程序运行时(而不是在编译阶段)将函数名绑定到具体的函数实现上
    -动态联编用于使用指针或引用来调用公共继承的类家族中不同类的同名成员函数,实现函数接口的重用。
    -动态多态性时通过虚函数实现的。

3.1 虚函数

定义: 虚函数是在基类中以关键字virtual说明,并在派生类中重新定义的一个非静态成员函数

  1. 基类的虚函数在派生类中仍然是虚函数
  2. 在派生类中重定义继承成员虚函数时,即使没有保留字virtual,该函数仍然是虚函数(但为了更好地表达这些函数的实质,最好加上这一保留字virtual)。
  3. 在基类中说明基函数的方法:
    virtual <函数返回类型> <函数名> (<参数表>)
  4. 静态成员函数、内联函数、友元函数和构造函数都不能说明为虚函数。但析构函数可以是虚函数。

3.2 动态联编过程

  1. 只有采用指向基类对象的指针或引用来调用虚函数时,才会按动态联编的方式来调用
  2. 用普通对象来调用虚函数不能实现动态联编
  3. 基类中的虚函数必须具有public或protected访问权限,且派生类必须以公有继承方式从基类派生

4. 纯虚函数和抽象类

  1. 为了实现接口重用,必须以虚函数的形式在基类中为其派生类定义一个接口。
  2. 但基类虚成员函数有时无法具体实现。
  3. 对于这样一些物理上无法实现而逻辑上又不得不存在的抽象的虚函数,可以将其在基类中用不包括任何代码的纯虚函数来定义。
  4. 而其具体的实现则可在派生类中完成

4.1 虚函数

定义: 在基类中没有具体实现的虚函数

  1. 如果基类中包括有纯虚函数,那么在任何派生类中都必须重定义该函数,因为它们不能直接使用从基类继承下来的虚函数
  2. 纯虚函数的一般形式:
    virtual <函数返回类型> <函数名>(<参数表>)= 0;

4.2 抽象类

定义: 包含纯虚函数的类称做抽象类。

  1. 由于无法实例化一个含纯虚函数的抽象类,因而不能创建抽象类的对象
  2. 抽象类不能用作变量类型、函数返回和显式转换的类型,但可定义指向抽象类的指针或引用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值