继承与多态
第1页,共26页,2022年,5月20日,19点51分,星期二
第8章 继承与多态
静态多态的实现
动态多态的实现
纯虚函数与抽象基类
静态多态的实现
动态多态的实现
动态多态的实现
掌握静态多态的实现
掌
//自定义类line,为基类graphelem 的派生类
public:
virtual void draw(){ …… }; //虚函数draw,负责画出“line”
...
};
class circle:public graphelem
{
//自定义类circle,为基类graphelem 的派生类
public:
virtual void draw(){ …… }; //虚函数draw,负责画“circle”
……
};
派生类
第11页,共26页,2022年,5月20日,19点51分,星期二
多态性
动态多态的实现方法
1. 虚函数
第8章 继承与多态
使用虚函数时,需要注意以下3点
说明某一函数成员为虚函数,方法是在说明前加关键字“virtual”。
派生类中虚函数处的关键字virtual可以省略,但基类处的不可省
调用虚函数时,系统对它将采用动态联编的方式进行处理。
第12页,共26页,2022年,5月20日,19点51分,星期二
多态性
动态多态的实现方法
2. 动态联编的机制
第8章 继承与多态
使用动态联编时,确定要调用的函数有两种方式
line ln1; circle cir1; triangle tri1;
(); (); ();
通过类对象
第13页,共26页,2022年,5月20日,19点51分,星期二
多态性
动态多态的实现方法
2. 动态联编的机制
第8章 继承与多态
使用动态联编时,确定要调用的函数有两种方式
graphelem *pObj;
line ln1; circle cir1; triangle tri1;
pObj=&lin1; pObj->draw();
pObj=&cir1; pObj->draw();
pObj=&tri1; pObj->draw();
通过指针
第14页,共26页,2022年,5月20日,19点51分,星期二
多态性
动态多态的实现方法
2. 动态联编的机制
第8章 继承与多态
动态联编的基本步骤
在编译过程中,扫描到表达式pb->f()时,首先检查f()是否为虚函数(若f()不是虚函数,则按静态联编处理,在编译时必须为f()确定对应的函数体代码);
(2)若f()为虚函数,则仅把与f()同原型的虚函数的地址信息等列表待查;
(3)在程序运行阶段,当程序执行到表达式pb->f()时,根据指针当前所指向的对象类属,来决定这时的f()应执行哪个类中的哪个f(),从而决定执行哪个函数体。
第15页,共26页,2022年,5月20日,19点51分,星期二
多态性
动态多态的实现方法
2. 动态联编的机制
第8章 继承与多态
虚函数的动态联编的实现,主要依赖于下面一些条件:
1)基类CB 可有多个派生类CD1,CD2,……,CDn;
2)CB 类指针pb 可以指向CB 的对象,也可以指向CD1,CD2,……CDn的对象;
3)CB 类和CD1,CD2,……CDn 类可以有同样原型(而函数体各异)的函数成员f()(虚函数);
4)运行着的程序根据查对当前指针pb所指向的对象是属于哪个类的,再决定到底执行哪个f()。
第16页,共26页,2022年,5月20日,19点51分,星期二
多态性
动态多态的实现方法
2. 动态联编的机制
第8章 继承与多态
采用虚函数对于程序有益之处在于。
1)可使程序简单易读。
2)它使得程序模块间的独立性加强。
3)增加了程序的易维护性。
4)提高了程序中“信息隐藏”的等级。
第17页,共26页,2022年,5月20日,19点51分,星期二
多态性
纯虚函数和抽象基类
第8章 继承与多态
抽象基类的概念是虚函数概念的自然引申,它是虚函数使用的一个更理想的形式。
virtual函数原型=0;
若在虚函数的原型后加上“=0”字样而替掉函数定义体(没有具体的实现),则这样的虚函数称为纯虚函数。
virtual void print()=0;
第18页,共26页,2022年,5月20日,19点51分,星期二
多态性
8
继承与多态 来自淘豆网www.taodocs.com转载请标明出处.