第8章 多态性与运算符重载-C++程序设计基础案例教程-吴艳-清华大学出版社

合集下载

c++0

c++0

休息 30
前一页
例8-3
运 算 符 重 载

将+、-(双目)重载为复数类的友元 函数。

两个操作数都是复数类的对象。
前一页
休息
31
#include<iostream.h> class complex //复数类声明 { public: //外部接口 complex(double r=0.0,double i=0.0) { real=r; imag=i; } //构造函数 friend complex operator + (complex c1,complex c2); //运算符+重载为友元函数 friend complex operator - (complex c1,complex c2); //运算符-重载为友元函数 void display(); //显示复数的值 private: //私有数据成员 double real; double imag; };
程序运行结果为:
First time output:23:59:59 Clock++: 0:0:0 ++Clock: 0:0:1
运算符友元函数的设计
运 算 符 重 载
如果需要重载一个运算符,使之能够 用于操作某类对象的私有成员,可以 此将运算符重载为该类的友元函数。 函数的形参代表依自左至右次序排列 的各操作数。 后臵单目运算符 ++和--的重载函数, 形参列表中要增加一个int,但不必 写形参名。
//其它成员函数的实现略 void main() { Clock myClock(23,59,59); cout<<"First time output:"; myClock.ShowTime(); myClock++; myClock.ShowTime(); ++myClock; myClock.ShowTime(); }

c++程序设计PPT第8章 多态性

c++程序设计PPT第8章 多态性

程序代码:#include<iostream>
#include<string>
using namespace std;
class Base {
public:
Base() {
cout << "Base()..." << endl;
}
virtual ~Base() {
//定义虚析构函数
cout << "~Base()..." << endl;
virtual void gun(char) override final;
//正确,gun(char) 加了final
void hun();
// ②
};
class Third final: public Derived {
// Third类被修饰为final
public:
第8章 多态性
8.2.3 动态绑定的实现方法 在VC++中,多态是通过3个层次的指针(即“三层间接访问”)实现的。
问)。有人形象地称抽象基类中的纯虚函数为“软插槽”,而派生类中定义的函数体则是插在其上的
“软模块”。
第8章 多态性
8.3 纯虚函数与抽象类
【例8-4】纯虚函数与抽象类用法示例。以几何形类为抽象基类,派生圆、矩形、圆柱等类,计算各种几何形 的面积和体积。
程序代码:
//文件名: shape.h
#ifndef SHAPE_H
用的仍然是基类的虚函数。
通过类的对象调用虚函数仅属于正常的成员函数调用,调用关系是在编译时确定的,属于静态绑定。
动态绑定(动态多态性)仅发生在使用基类指针或基类引用调用虚函数的过程中。

C运算符重载PPT课件

C运算符重载PPT课件

//如果参数
index超出规定的范围,则输出越界信息
{ cout<<"\nError:下标"<<index<<"出界!"<<'\n';
exit(2);
//stdlib.h
}
return arp[index]; //如果不越界,则返回 相应的数据
}
第28页/共35页
void main(void)
{
CArray m1(10),m2(3);
int len;
int *arp;
public:
CArray(int n=0);
~CArray() {if (arp) delete[]arp;}
int & operator[] (int index);
义重载的下标运算符
};
// 定
第26页/共35页
CArray::CArray(int n)
{
if(n>0){
第14页/共35页
3. 复合运算符+= (利用成员函数重载) C C:: operator+=(C m ) { x+=m.x; return *this; }
C a,b; a+=b;
a.operator+=(b)
第15页/共35页
3. 复合运算符+= (利用友元函数重载) 先在类中声明: friend C operator+=(C & ,C); 再在类外定义: C operator+=(C &m1, C m2 ) { m1.x+=m2.x; return m1; }

Unit08 类和对象-C#程序设计案例教程-向燕飞-清华大学出版社

Unit08 类和对象-C#程序设计案例教程-向燕飞-清华大学出版社

8.2.4 类的构造函数和析构函数
构造函数是一种特殊的方法成员,构造函数的主要作用是 在创建对象(声明对象)时初始化对象。一个类定义必 须有至少一个构造函数,如果定义类时,没有声明构造 函数,系统会提供一个默认的构造函数,如果声明了构 造函数,系统将不再提供构默认造函数。
例8-2 默认构造函数的意义。 namespace demo08_01构造函数 {
C#程序设计案例教程
08 类和对象
学习目标
理解面向对象的基本思想 掌握类和对象的关系 掌握类的定义以及对象的创建
8.1案例描述
小程是软件研发组成员,所在的小组接到一个员工管理系统 的开发任务。其中一个模块要求:创建一名员工,输入其工号、 姓名、入职时间、部门等信息,并输出各项信息。
8.2 知识链接 8.2.1 面向对象的基本思想
在面向对象的程序里,万物皆对象,它将对象作 为程序的基本单元,将程序和数据封装其中, 以提高软件的重用性、灵活性和扩展性。面向 对象的封装特性具有以下优点:
良好的封装能够减少耦合; 类内部的实现可以自由地修改; 类具有清晰的对外接口
例如一个学生类图如图所示: public class Student //一个学生类 {
一旦实例化Customer对象,就可以使用语法 Object.FieldName来访问这些字段,例如:
Customer Customer1 = new Customer(); Customer1.CustomerID=8866; Customer1.FirstName = "Simon"; Customer1. LastName = "Green";
namespace demo08_01static

C++语言程序设计 第八章 多态性 PPT课件

C++语言程序设计 第八章  多态性 PPT课件
complex(double r=0.0,double i=0.0) { real=r; imag=i; } //构造函数
friend complex operator + (complex c1,complex c2); //运算符+重载为友元函数
friend complex operator - (complex c1,complex c2); //运算符-重载为友元函数
{ complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag);
}
18
void complex::display()
{ cout<<"("<<real<<","<<imag<<")"<<endl; }
private: //私有数据成员
int Hour,Minute,Second;
};
24
Clock& Clock::operator ++() //前置单目运算符重载函数 { Second++;
if(Second>=60) { Second=Second-60;
Minute++; if(Minute>=60) {
11
C++语言程序设计
两种形式

算 符
重载为类成员函数。
重 重载为友元函数。

12
C++语言程序设计
运算符函数
运 算 符

教学大纲-C++程序设计基础案例教程-吴艳-清华大学出版社

教学大纲-C++程序设计基础案例教程-吴艳-清华大学出版社

程序设计基础课程教学大纲一、课程性质、目的和任务《程序设计基础》课程是计算机科学与技术专业学生必修的专业基础课程之一。

通过本课程学习,使学生能较系统地掌握程序设计的基本语法、程序设计基本思想的基本知识、原理和方法,初步具备分析问题能力、解决问题的能力,为数据结构,Java程序及Java WEB等课程打下基础。

本课程教学要求学生熟练掌握高级程序设计语言程序的构成;基本语法成分;数据定义和相关运算;熟练掌握程序的三种基本控制流程的概念和实现;函数的定义和调用;熟练掌握指针的基本概念,能够应用于数据组织和函数调用;熟练掌握面向对象程序设计的核心概念:类和对象;以及类的特性:封装、继承、多态。

熟练掌握用C++定义类和操作对象的方法;有关派生类的构造机制;多态的实现技术等问题。

要求学生能够使用结构化思想和面向对象的思维方法设计实用性较强的小型应用程序,并能够在集成环境下(例如Visual C++)调试运行通过。

二、教学内容及教学基本要求第1章概述1.概念了解程序设计语言的发展和分类;理解并掌握程序的基本结构和程序设计的基本步骤。

2.基本数据类型与数值表达式了解数据类型的分类;理解关系运算符与逻辑运算符及其组成的具有逻辑值的表达式;理解自动类型转换和强制类型转换、赋值和复合赋值的概念;掌握运算符与表达式的概念;掌握自增和自减操作符的运算规则;掌握常量的表示法;掌握变量的定义及初始化方法;3.数据的输入和输出掌握cin、cout、printf、scanf的使用规则及用法;第2章程序控制语句1.表达式语句和复合语句了解 C++语句的概念及种类;掌握表达式语句的构成及语法形式;掌握复合语句的使用。

2.选择结构掌握二条分支语句的格式及基本应用;熟练掌握if … else 的三种语法;理解 switch 与break 语句的作用及使用方法。

3.循环结构理解程序设计中构成循环的方法;掌握for、while、do-while语句的用法;了解break、 continue 在循环语句中的作用。

《C 程序设计实例与操作》课件第10章 多态性、虚函数与运算符重载

《C  程序设计实例与操作》课件第10章 多态性、虚函数与运算符重载

t.imag=imag+c.imag;
return t;
} 则a+b为隐式调用,它等价于a.operator+(b),这是显式调用。
2.单目运算符重载作为类的成员函数
单目运算符重载作为类的成员函数时,操作数为访问该重 载运算符的对象本身的数据,也由this指针指出,因此,单目 运算符重载函数没有参数。
2.赋值运算符的重载
通常情况下,系统会自动生成一个默认的赋值运算符函数, 提供同类对象之间进行赋值的功能。但在某些特殊情况下,必 须要定义一个赋值运算符重载函数。
10.5 实现类型转换
类型转换函数用来将类类型转换为标准数据类型。
operator 类型名() { 转换语句 } 类型转换函数只能作为成员函数,不能作为友元函数,它又 称为类型转换运算符重载函数。
{}
virtual~ Point()
//定义虚析构函数
{}
virtual double CalArea() const=0;
//定义纯虚函数
};
class Rect:public Point {
//定义派生类Rect
protected:
double xcoord1,ycoord1;
public:
双目运算符重载为友元函数时,由于没有this指针,所以 操作数要通过友元函数的参数指出。
例如:
operator+(a,b); a+b;
//显式调用 //隐式调用
4.单目运算符重载作为类的友元函数
与双目运算符重载作为友元函数类似,单目运算符重载作 为友元函数时,操作数要通过友元函数的参数指出。
例如:
operator++(a); ++a;

C++程序设计教程修订版 第18章 运算符重载

C++程序设计教程修订版 第18章 运算符重载
C++中有两种类型的赋值运 算符:一类是“+=”和“-=” 等先计算后赋值的运算符,也 称之为复合赋值运算符 另一类是“=”即直接赋值的运 算符,也称之为赋值运算符。

当对第一操作数进行运算 并将值赋给第一操作数时, 可以简化赋值运算。比如 “a = a + b”可以简化为 “a += b”。对其他的操作, 比如“-、*和%” 等等,也 可以采用同样的方法进行简 化。
ostream& operator<<(ostream& o, const Point& d){ return o<<”(“<<d.x<<”,“<<d.y<<”)\n”; }
4.运算符作成员函数

成员运算符函数 定义 成员运算符函数定义的形式与类 外的运算符函数定义基本相同, 只是前者定义在类中。如 class X{ //…

class X{ //…;type operator +(X a);};
5.重载增量运算符

如同“++”运算符有前缀、后缀两种使用形 式,“++”和“--”重载运算符也有前缀和 后缀两种运算符重载形式,以“++”重载运 算符为例,其语法格式如下:


<函数类型> operator ++(); //前缀 运算 <函数类型> operator ++(int); //后缀 运算

说明 类型转换函数只能定义为一个类的成员 函数,而不能为友元函数 在类中可以有多个类型转换函数。C++编 译器将根据操作数的类型自动地选择一 个合适的类型转换函数与之匹配。 实际上,类型转换运算符将对象转换成 类型名规定的类型。转换时的形式就像 强制转换一样。如果没有转换运算符定 义,直接用强制转换是不行的,因为强 制转换只能对标准数据类型进行操作, 对类类型的操作是没有定义的。 类类型转换函数没有没有参数,也不显 式给出返回类型 类类型转换函数中必须有“return 目的 类型的数据;”的语句,即必须送回目 的类型数据作为函数的返回值。

L08多态——福州大学《C++程序设计》课件PPT

L08多态——福州大学《C++程序设计》课件PPT

11
#include<iostream> using namespace std; class plex //复数类声明 { public: //外部接口
plex(double r=0.0,double i=0.0){real=r;imag=i;} //构造函数
plex operator + (complex c2); //+重载为成员函数 complex operator - (complex c2); //-重载为成员函数 void display(); //输出复数 private: //私有数据成员 double real; //复数实部 double imag; //复数虚部 };
福州大学 吴小竹
运算符重载的实质

算 运算符重载是对已有的运算符赋予多重含义
符 必要性

– C++中预定义的运算符其运算对象只能是基本数
载 据类型,而不适用于用户自定义类型(如类)
实现机制
– 将指定的运算表达式转化为对运算符函数的调 用,运算对象转化为运算符函数的实参。
– 编译系统对重载运算符的选择,遵循函数重载 的选择原则。
void display(); //显示复数的值
private:
double real;
double imag;
};
4
面向对象程序设计
福州大学 吴小竹
问题举例——复数的运算

算 用“+”、“-”能够实现复数的加减运
符 重
算吗?
载 实现复数加减运算的方法
——重载“+”、“-”运算符
5
面向对象程序设计
6
面向对象程序设计

chapter twelve 多态

chapter twelve 多态

量或引用,使该指针指向不同的派生类的 对象,并通过 调用指针所指的虚函数才能实现动态的多态性。
本章小 结

多态:
同样的消息被不同类型的对象接收时导致完
全不同的行为,是对类的特定成员函数的再 抽象。
一个函数一旦被说明为虚函数 ,则无论说明它的类被继承了多少层,在每一层派
生类中该函数都保持virtual特性。因此,在派生类中
重新定义该函数时,不再需要关键字virtual。
但习惯上,为了提高程序的可读性,常常在每层派生类 中都重复地使用virtual关键字。
void test(Base & b) {int i=1; b.fn(i);
才确定将要调用的函数。
8.3虚函 数



虚函数是动态联编的基础。 是非静态的成员函数。 在类的声明中,在函数原型之前写virtual。 virtual 只用来说明类声明中的原型,不能用在 函数实现时。 具有继承性,基类中声明了虚函数,派生类中 无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。
静态:编译时的多态
虚函数----动态:运行时的多态
静态联编与 动态联编

联编:
程序自身彼此关联的过程,确定程序中的操
作调用与执行该操作的代码间的关系。

静态联编(静态束定)
名来限定要调用的函数。
例Leabharlann 联编工作出现在编译阶段,用对象名或者类

动态联编

联编工作在程序运行时执行,在程序运行时
class Base
{public: virtual void fn(int x)

C++程序设计语言 揣锦华 第8章 多态性

C++程序设计语言  揣锦华 第8章   多态性
本程序为时钟计时程序。在程序中将单目运算符 重载为类的成员函数,单目运算符前置“++”和后置 “++”的操作数是时钟类的对象,可以把这些运算符重 载为时钟类的成员函数。对于前置单目运算符,重载 函数没有形参;对于后置单目运算符,重载函数有一 个整数形参。本例中,我们把自增前置“++”和自减前 置“--”运算重载为point类的成员函数。
本例中重载的“+”、“-”函数中,都是创建一个 临时的无名对象作为返回值:
returnpoint(x+q.x,y+q.y);
这表面上看起来像是对构造函数的调用,但其实 并非如此。这是临时对象语法,它的含义是创建一个 临时对象并返回它。当然,也可以按如下形式返回函 数值:
pointpoint::operator+(pointq) { pointp; p.x=x+q.x;
第8章 多态性
和静态联编相对应,如果联编工作在程序运行阶段
完成,则称为动态联编。在编译、连接过程中无法解决 的联编问题,要等到程序开始运行之后再来确定。例如, 本章将要介绍的虚函数就是通过动态联编完成的。 函数重载在函数及类的章节中曾做过详细的讨论, 所以在本章中,静态多态性主要介绍运算符重载;对于 动态多态性,将对虚函数作详细介绍。
第8章 多态性
pointoperator+(pointp1);
pointoperator-(pointp1); };
//重载运算符“+”
//和“-”为成员函数
pointpoint::operator+(pointq)
{ returnpoint(x+q.x,y+q.y);
}

源代码-C++程序设计基础案例教程-吴艳-清华大学出版社

源代码-C++程序设计基础案例教程-吴艳-清华大学出版社

第2章C++简单程序设计【例2-1】C++简单小程序应用案例。

题目:要求用户输入一个矩形的长和宽,求其面积。

#include <iostream.h> //预处理命令行void main() //函数头{int a,b,s;cout<<"please input two numbers:\n";cin>>a>>b;s=a*b; //求矩形面积,结果赋值给变量s cout<<"the area is:"<<s<<endl;}【例2-2】变量定义语句的应用案例。

题目:编写程序实现计算任意长、任意宽的矩形面积。

#include <iostream.h>void main(){double x,y,area; //定义了三个双精度类型变量x、y、areacin>>x>>y; //通过键盘任意输入两个双精度数给矩形的长和宽area=x*y;cout<<"the area is:"<<area<<endl;}其运行结果为:【例2-3】define定义符号常量的应用案例。

题目:利用define命令定义符号常量,验证符号常量的应用。

#include <iostream.h>#define PI 3.14void main(){double r,area;cin>>r; //通过键盘任意输入一个双精度数给作为圆的半径值area=PI*r*r; //编译后area=3.14*r*rcout<<"the area is:"<<area<<endl;}其运行结果为:【例2-5】输出格式控制的应用案例。

题目:格式输出控制符的验证。

#include <iostream.h>void main(){int a,b,c,d,e;cout<<"please input five numbers(a-dec,b-oct,c-hex,d-hex,e-dec):"<<endl; cin>>a;cin>>oct>>b;cin>>hex>>c;cin>>d;cin>>dec>>e;cout<<"hex:a="<<hex<<a<<endl;cout<<"dec:b="<<dec<<b<<endl;cout<<"dec:c="<<c<<endl;cout<<"oct:d="<<oct<<d<<endl;cout<<"oct:e="<<oct<<e<<endl;cout<<dec<<endl;}程序运行时,输入:12 17 a2 ff 10其运行结果为:第3章程序设计结构【例3-1】顺序结构的应用案例1。

第4章 函数-C++程序设计基础案例教程-吴艳-清华大学出版社

第4章 函数-C++程序设计基础案例教程-吴艳-清华大学出版社
#include <iostream.h> void swap(float x,float y) { float z; z=x; x=y; y=z;} void main() { float x,y; cout<<"please input two numbers:"; cin>>x>>y; cout<<"x="<<x<<",y="<<y<<endl; swap(x,y); cout<<"x="<<x<<",y="<<y<<endl;}
array[j]=array[j-1]+array[j-2];}
4.1.4 函数的参数传递
1、值调用 值调用又分为数据传值调用和地址传值调用。
数据传值调用方式是将实参的数据值传递给形参。 实参和形参在栈空间内的地址不相同,改变形参值 不影响实参值;地址传值调用方式是将实参的地址 值传递给形参,实参和形参在栈空间内共用同一地 址,改变形参值就可以改变实参值。这里详细介绍 一下数据传值调用。
<数据类型> &<引用名>=<目标名>;
说明:
(1)数据类型是引用目标的数据类型,可以是基本 数据类型也可以是用户自定义类型。
函数调用的语法格式为:
<函数名>(<参数表>) 1、形参和实参
参数表中每个参数是一个表达式,用逗号分隔 。对于有参函数,在主调函数和被调函数之间进行 着数据传递。定义函数时函数名后面括号内的表达 式称为形式参数(简称“形参”),被调函数名后 面括号中的表达式称为实际参数(简称“实参”) 。函数调用时,要求实参和形参应个数相等、类型 一致,实参和形参必须按顺序一一对应传递数据。

《CC++语言程序设计》课件第12章 多态性

《CC++语言程序设计》课件第12章 多态性
C++为运算符重载提供了一种方法,使用 以下形式进行运算符重载:
type operator@(参数表); 其中,@表示要重载的运算符,type是返 回类型。
除了“. ”、“.*”、“::”、“?:”、“#”、 “##”其它都可以重载。
delete、new、指针、引用也可以重载。 运算符函数可以定义为内联函数。 用户定义的运算符不改变运算符的优先次序。 不可以定义系统定义的运算符集之外的运算符。 不能改变运算符的的语法结构。
class B:public A{ public:
int *b; B() {b=new(int); } virtual void func1(){} virtual ~B() { delete b; cout<<"delete b"<<endl; } }; void main() { A *pb=new B(); delete pb; }
12.3 运算符重载
自定义的类的运算往往用运算符重载函数 来实现
运算符重载的目的:扩充语言的功能,即 将运算符扩充到用户定义的类型上去。
运算符重载通过创建运算符函数operator() 来实现。可以重载成为类的成员,也可是 类的友元。
12.3.1运算符重载的规则
为了表达方便,人们希望能对自定义的类 型进行运算,希望内部运算符(如“+” 、“-”、“*”、“/”等)在特定的类对 象上以新的含义进行解释,即实现运算符 的重载。
【例12.2 】使用运算符重载函数将类对象相加。
#include <iostream.h>
class complex{
public:
double real;
double imag;

第2章 C++简单程序设计-C++程序设计基础案例教程-吴艳-清华大学出版社

第2章 C++简单程序设计-C++程序设计基础案例教程-吴艳-清华大学出版社
常量
I/O流
预定义的 插入符和 提取符
变量 符号常量 运算符与表达

简单的
I/O格式 控制
综合案例
系统需求 分析
2.1 C++语言概述
本教材采用的编程环境Visual C++ 6.0。
2.1.1 C++的产生
为了规避C语言的不足之处,1980年贝尔实验 室的Bjarne Stroustrup博士开始对C语言进行改进, 一开始C++是作为C语言的增强版出现的,从给C语 言增加类开始入手,不断增加新的特性。虚函数、 运算符重载、多重继承、模板、异常、名字空间等 逐渐被加入标准,1983年正式命名新的C语言为C++ 语言。1998年国际标准组织(ISO)颁布了C++程序 设计语言的国际标准ISO/IEC 14882-1998。C++是具 有国际标准的编程语言,通常称作ANSI/ISO C++。
cin>>a>>b;
s=a*b;
//求矩形面积,结果赋值给变量s
cout<<"the area is:"<<s<<endl;
}
1、编译预处理指令 以“#”开头的命令为预处理命令,C++提供
了三个预处理命令:宏定义命令、文件包含命令和 条件编译命令。本例中使用的是文件包含命令。 include是关键字,iostream.h是输入输出流的一个 头文件名。该文件名可以用一对双引号(””)或者 一对尖括号(<>)括起来均可,具体区别读者可以 自行查阅资料。 注意:由于预处理命令行不是C++语句,所以不能 用分号(;)结束。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
静态联编的缺点是不经过重新编译程序将无 法实现。
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” ,函数名为合法的用户自定义标识符,形参列表可以是由逗 号(“,”)隔开的多个参数,也可以是空,但是圆括号不 能省。
相关文档
最新文档