当前位置:
文档之家› 第8章 多态性与运算符重载-C++程序设计基础案例教程-吴艳-清华大学出版社
第8章 多态性与运算符重载-C++程序设计基础案例教程-吴艳-清华大学出版社
静态联编的缺点是不经过重新编译程序将无 法实现。
2、动态联编 动态联编是在程序运行阶段完成的联编,就
是指同属于某一基类的不同派生类对象,在形式 上调用从基类继承的同一成员函数时,实际调用 了各自派生类的同名函数成员。
运行时的多态就是用动态联编来完成的,当 程序调用到某一函数名时,才去寻找和连接其程 序代码。对面向对象程序而言,就是当对象接收 到某一消息时,才去寻找和连接相应的方法。
void print() { cout<<"This is print C"<<endl; } }; void main() { A a,*p; B b; C c; p=&a; p->print(); p=&b; p->print(); p=&c; p->print(); }
总之,如果在派生类中的函数满足以下三个条件则可以判 断该函数是虚函数: (1)该函数与基类的虚函数有相同的名称。 (2)该函数与基类的虚函数有相同的参数个数及相同对应参数 类型。 (3)该函数与基类的虚函数有相同的返回类型或者满足赋值兼 容规则的指针、引用型。
1、静态联编 静态联编是在编译阶段完成的联编,就是把
一条消息和一个对象的方法相结合的过程。编译 时的多态就是通过静态联编实现的,函数的重载 和运算符的重载都属于这种类型。
静态联编的优点是在访问方法时没有运行时 间的开销,函数的调用与函数定义的绑定在程序 执行前进行。因此,一个成员函数的调用并不比 普通函数的调用更费时。
//调用基类中的公有函数成员display() //调用派生类中的公有函数成display()
【例8-2】虚函数的应用案例2。 题目:针对例题8-1,进一步验证利用虚函数的机制来实现动态 联编。
#include <iostream.h>
class A
{ public:
virtual void print()
{ cout<<"This is print A"<<endl; }
};
class B:public A
{ public: void print()
//关键字virtual可以省略
{ cout<<"This is print B"<<endl; }
};
class C:public B { public:
8.1.2 多态的实现
在C++语言中支持两种多态性:编译时的多态 和运行时的多态。多态的实现和联编这一概念有关 。所谓联编就是把函数名与函数体的程序代码连接 在一起的过程。联编又可分为静态联编和动态联编 。系统用实参与形参进行匹配,对于同名的重载函 数便根据参数上的差异进行区分,然后进行联编, 从而实现多态。
例如,
#include <iostream.h> class Base { public:
void display() { cout<<"Hey!"<<endl; } }; class Derived:public Base { public: void display()
{ cout<<"Every Boy。"<<endl; } }; void main() { Base obj1,*p; Derived obj2;
虚函数的说明: (1)派生类应该从它的基类公有派生。一个虚函数无论被公有 继承多少次,它仍然保持虚函数的特性。 (2)必须首先在基类中定义虚函数。在实际应用中,应该在类 等级内需要具有动态多态性的几个层次中的最高层类内首先声 明虚函数。 (3)在派生类对基类声明的虚函数进行重定义时,关键字 virtual可以写也可以不写。但在容易引起混乱的情况下,最好在 对派生类的虚函数进行重定义时也加上关键字virtual。 (4)使用对象名和点运算符(“.”)的方式也可以调用虚函数 ,但这在编译时进行的是静态联编,它没有充分发挥虚函数的 特性。只有通过基类指针访问虚函数时才能获得运行时的多态 性(动态联编)。
8.1多态性
在C++语言中,多态性就是指不同的对象收到 相同的消息时,会产生不同的动作。例如要计算圆 、长方形或正方形的面积等,若给定一个半径,那 么求的是圆面积,若给定一个长和一个宽求的是矩 形面积,若给定一条边长那求的是正方形面积。
8.1.1 通用多态和专用多态
多态性是面向对象程序设计的重要特征。在 C++语言中,多态性可以细分为四类:参数多态、 包含多态、重载多态和强制多态。前面两种多态统 称为通用多态,而后面两种统称为专用多态。
};
class Derived:public Base
{ public:
void display()
{ cout<<" I'm Leifeng."<<endl; }
};
void main() {
Base obj1,*p; Derived obj2; p=&obj1; p->display(); p=&obj2; p->display(); }
C++程序设计基础案例教程
吴艳
章节知识
综合案例
参考答案
教材知识体系
课程
由浅入深,逐步 递进,案例丰富。
教学 学习
项目是结合
微课堂辅助
第8章 多态性与运算符重载
多态性
通用多态 和专用多
态
多态的实 现
抽象类
运算符重载
运算符重载 的概念
“++”和 “--”重
载
重载为类的 成员函数
重载为类的 友元函数
(3)函数体为函数功能实现语句。
【例8-1】虚函数的应用案例1。
题目:虚函数机制在程序中的应用,验证动态联编的效果。
ห้องสมุดไป่ตู้
#include<iostream.h>
class Base
{ public:
virtual void display()
//基类Base中定义了虚函数display()
{ cout<<"Hey!“; }
p=&obj1; p->display(); p=&obj2; }
p->display();
虚函数定义的一般语法格式为: virtual <函数类型> <函数名> (<形参表>) {
//函数体 } 说明: (1)关键词virtual不能省略。 (2)函数类型为函数返回值类型,没有返回值时为“void” ,函数名为合法的用户自定义标识符,形参列表可以是由逗 号(“,”)隔开的多个参数,也可以是空,但是圆括号不 能省。