C++语言程序设计(郑莉)课件8【多态性】
C语言程序设计基础-多态 82页PPT文档
}
void print(int x, int y)
{ cout<<"Calling print(int, int) with " <<x<<", "<<y<< "\n";
}
void print(double x)
{ cout<<"Calling print(double) with "<<x<<"\n";
例: int fun(int );
…
fun(‘A’); // 将字符‘A’转换为int型
(1)隐式类型转换引起的二义性 隐式类型转换是由编译程序自动完成,易引起函数重载 的二义性,例如:
#include <iostream.h> float abs(float x)
// 浮点类型数据的绝对值函数
{
程序设计是计算机学科的 核心和灵魂
程序设计基础
多态性
1 多态性的基本概念
1、程序的多态性
多态性:在程序中同一符号或名字在不同情况下具有 不同解释,如:运算符 / *
多态性的两种最基本形式 编译时多态性:指在程序编译阶段即可确定下来的 多态性,由重载机制实现: 函数重载 运算符重载 运行时多态性:指必须等到程序动态运行时才可确 定的多态性,由继承结合虚函数的动态绑定实现。
float f=1.5; print(f);
Calling print(double) with 1.5
}
4、构造函数重载
为一个类提供了初始化对象的各种方法。
#include <iostream.h>
C++程序设计课件.多态性
-11-
2.运算符重载的几个问题:
(1)定义:运算符重载是对已有的运算符赋予多重含义 , Software College of Northeast Normal University 使同一个运算符作用于不同类型的数据时,导致不同类型 的行为。C++允许同一运算符具有多种不同运算功能的机 制。
(2)为什么需要运算符重载:C++中预定义了许多运算符, 能够满足用户的一般应用要求,但是其运算的对象应是基 本数据类型,而不适用于用户自定义数据类型(如类),这可 以使用运算符重载。
a.双目运算:oprdl B oprd2 oprdl.operator B (oprd2)
b.单目运算 1)前置单目运算:U oprd oprd.operator U( ) 2)后置单目运算:oprd V 为区别前置单目运算函数要带有一个整型(int)形参。 oprd.operator V(int)
#include<iostream.h>
class point
{ private:
float x,y;
public:
point(float xx=0,float yy=0){x=xx;y=yy;}
float get_x(){return x;}
float get_y(){return y;}
point operator++();
//声明point类的对象
p3=p1+p2;
//两点相加
p4=p1-p2;
//两点相减
cout<<"p1+p2:x="<<p3.get_x()<<",y="<<p3.get_y()<<endl;
(C++完整PPT课件) 第 8 章 多态性
第八章 多态性
4.运算符new和delete重载
//EX8_5.cpp : 演示重载new和delete的程序。其中new通过 //malloc( )函数实现,new的操作数是申请内存单元的字节个数。 //delete通过free( )函数实现,它的操作数是一个指针,即告诉 //系统释放哪里的单元。 #include <iostream.h> #include<malloc.h> class rect { private: int length, width; public: rect ( int l, int w ) { length = l; width = w; }
第八章 多态性
point operator + ( point p1, point p2 ) { return point (p1.x+p2.x, p1.y+p2.y) ; }
point operator - ( point p1, point p2 ) { return point (p1.x- p2.x, p1.y-p2.y) ; } void main( ) { point p1(3, 3), p2(2, 2), p3, p4 ; //声明point类的对象 p3=p1+p2; //两点相加 p4=p1- p2; //两点相减 cout<<"p1+p2: x="<<p3.get_x( )<<", y="<<p3.get_y( )<<endl ; cout<<"p1- p2: x="<<p4.get_x( )<<", y="<<p4.get_y( )<<endl ; } 程序运行结果:p1+p2: x=5, y=5 p1- p2: x=1, y=1
C 程序设计04章多态性.ppt
4.1 多态性概述
多态性的概念:(polymorphisn) 是指多种表现形式,具体地说,就是把同样的消息发给不同类型的 对象后可能导致完全不同的行为,即“一个对外接口,对应多个内 在实现方法”。多态性连同前面所讲过的封装性和继承性一起,构 成了面向对象程序设计的三大基本特征。 多态性的实现:
Hour=NewH; Minute=NewM; Second=NewS; } void Clock::ShowTime() {
cout<<Hour<<":"<<Minute<<":"<<Second<<endl; }
LanJiming@ copyright Saturday, April 11, 2020 四川理工学院计算机学院 《C++程序设计》 第 10页
LanJiming@ copyright Saturday, April 11, 2020 四川理工学院计算机学院 《C++程序设计》 第 3页
又如:要重载前置单目运算符P为类成员函数,使之能够实现表 达式P oprd的运算,其中假定oprd 为A类的对象,则P就应该被重 载为 A 类的成员函数,没有形参。经重载后,执行表达式P oprd就 相当于执行oprd.operatorU( ) 。
友元概念的引入: 按照封装性的概念,一个类之外的函数只能访问这个类中的 public成员。如果要让这个类之外的函数访问到自己的private或 protected成员,就必须打破原有的封装性,方法就是设定该类的友 元。应该说,友元和封装是一对相反的概念,一个是要“实现开 放”,另一个则是要“限制开放”。 一个类的友元可以是一个普通的函数(即非成员函数)、另一 个类的成员函数或者另一个完整的类。 如何设置一个类的友元呢?在类的定义中使用friend保留字进行 说明,并在friend之后列出友元的名字。如果是把一个完整的类B 作为类A的友元,则类B中所有的成员函数都将被视为类A的友元函 数。
C第章多态性精品PPT课件
cout<<“area of a:”<<a.area()<<endl;
cout<<“area of c:”<<c.area()<<endl;
Point *p=&c;
cout<<“area of c:”<<p->area()<<endl;
}
第05章 多态性
信工计算机教研室
覆盖技术
☺a.area()表达式明确告诉编译器,它调用的 是Point的成员函数area,输出0。
☺c.area()表达式明确表示调用的是Circle的 成员函数area,输出19.6349。
☺因为指针p的数据类型是Point,根据赋值 兼容性规则,p->area(),调用的是Point 的成员函数,输出0。
第05章 多态性
信工计算机教研室
4、访问被覆盖的方法
class CPoint {
int x,y; public:
double area() { return 0;} };
第05章 多态性
信工计算机教研室
覆盖技术
class Circle: public Point {
double radius; public:
Circle(double a,double b,double r) : Point(a, b) { radius=r; }
{ num=int(a+0.5); } void show() { cout<<num<<endl; } };
第05章 多态性
信工计算机教研室
成员函数重载
void main() {
C 程序设计 教学课件 ppt 第8章_指针
量p,第二句将c的值赋为10,第三句将指针变量p指向
的地址中的值(也就是d的值赋为12),第四句将d的
值赋为16。那么,经过这四句执行之后,c与d中的值
均为最后一个赋值语句给出的值16
C++程序设计,郑莉,清华大学 17
8.2指针运算
• 指针变量可以参与的运算主要有赋值运算、算术 运算以及关系运算
• C++中对内存的访问
• 对内存单元的访问管理可以和图书馆中书籍管理的 情况类比 ▫ 计算机内存访问存储空间与图书馆找书的过程
C++程序设计,郑莉,清华大学 8
8.1 指针
8.1.2 指针变量的声明
• 指针是一种数据类型,具有指针类型的变量称为指 针变量,指针变量是用于存放内存单元地址的
• 指针变量的声明格式如下:
C++程序设计,郑莉,清华大学 18
8.2 指针运算
8.2.1 指针的赋值
• 当一个指针变量被声明时,只是给这个指针变量 分配了一块内存空间,而这块内存空间中存储的 值却是不确定的,指向的内存地址中可能存储着 重要的数据或程序代码等,如果访问这个地址甚 至改变了其中存储的值的话,就很可能引起重要 数据的破坏或系统运行的错误
▫ 指针变量所参与的运算的运算规则是与它指向的地址 的数据类型密切相关的。C++语言里面没有单独设计 一种“地址”数据类型,而是允许为每一种数据类型 都定义相应的指针变量,同时,指针变量的数据类型 也必须定义清楚,以确定它指向的地址的数据类型
C++程序设计,郑莉,清华大学 11
8.1 指针
8.1.3 与地址有关的运算——“*”和“&”
指向变量a的存储地址,*q的值就是变量a的值
第一章绪论清华大学郑莉ppt课件
十进制整数转换成R进制的整数
“除R取余”法,例如:
2 68
余数
示
2 34 ┄┄┄┄┄┄┄┄┄┄┄┄0 低位
与
2 17 ┄┄┄┄┄┄┄┄┄┄┄ 0
存 储
2 8 ┄┄┄┄┄┄┄┄┄┄┄ 1 2 4 ┄┄┄┄┄┄┄┄┄┄ 0 2 2 ┄┄┄┄┄┄┄┄┄┄ 0
2 1 ┄┄┄┄┄┄┄┄┄ 0
0 ┄┄┄┄┄┄┄┄┄ 1 高位
15
C++语言程序设面计 向对象的基本概念
清华大学 郑莉
面
——类
向
对 面向对象方法中的"类"
象
具有相同属性和服务的一组对象的集合
的 方 法
为属于该类的全部对象提供了抽象的描述, 包括属性和行为两个主要部分。
类与对象的关系:
犹如模具与铸件之间的关系,一个属于某
类的对象称为该类的一个实例。
16
C++语言程序设面计 向对象的基本概念
发 高软件维护的效率。
25
C++语言程序设计
信息的表示和存储
信息的分类 计算机的数字系统 程序设计中常用的数制 不同进位计数制间的转换 信息的存储单位 二进制数的编码表示 小数的表示方法 非数值信息的表示
清华大学 郑莉
26
C++语言程序设计
清华大学 郑莉
信 信息的分类
息
的 表
┌ 指令
存
=(255.75)10
储
(3506.2)8=3*83 + 5*82 + 0*81 + 6*80 +2*8-1 =(1862.25)10
(0.2A)16=2*16-1 +10*16-2=(0.1640625)10
C 程序设计 教学课件 ppt 第11章_多态性
▫ 分析
这个结果和例10-7的输出结果很不一样。Base1声明Show
为基函数,派生类Base2,C重写了该函数,通过向上转
型,分别传递Base1,Base2,C的指针给CallShow函数
时,虽然在CallShow函数中的语句是“pb1->Show();”,
其中pb1被声明为Base1的指针,但是调用的函数确分别
▫ 参数多态:与将在第14章中介绍的类模板相关联 ▫ 前两种称为专用多态,后两种称为通用多态
C++程序设计,郑莉,清华大学 4
11.2 虚函数
11.2.1 一般虚函数成员
• 将类的某个成员函数用virtual关键字声明得到的函 数就是虚函数
• 定义格式为:
virtual 返回类型 函数名(形参表) {
class C:public Base {
public:
C() { ip = new int(0); } //类C构造函数,初始化成员
~C();
//类C析构函数
private:
int * ip; };
C::~C() {
delete ip;
cout<<"ip has been deleted"<<endl;
};
class C:public Base2 {
void Show() { cout<<"C::Show()"<<endl; }
//公共函数Show
};
C++程序设计,郑莉,清华大学 6
11.2 虚函数
11.2.1 一般虚函数成员
void CallShow(Base1* pb1) { //全局函数,参数为Base1的指针
C语言程序设计清华大学郑莉8
friend complex operator - (complex c1,complex c2); //运算符-重载为友元函数
void display(); //显示复数的值 private: //私有数据成员
double real; double imag; };
第27页/共42页
27
complex operator +(complex c1,complex c2) //运算符重载友元函数实现
{ return complex(c2.real+c1.real, c2.imag+c1.imag);
} complex operator -(complex c1,complex c2)
complex operator + (complex c2); //+重载为成员函数
complex operator - (complex c2); //-重载为成员函数 void display(); //输出复数 private: //私有数据成员 double real; //复数实部 double imag; //复数虚部
12
complex complex:: operator -(complex c2) //重载函数实现
{ complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag);
}
第13页/共42页
13
void complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; }
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课件
程序设计方法的发展历程
面 • 优点:
——面向对象的方法
向 • 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。
• 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。
对
象
的
方
法
第12页/共702页
面向对象的基本概念
面 • 一般意义上的对象:
——对象
不同进位计数制间的转换
信 ——十进制→ R 进制
息
的
十进制小数转换成R进制小数
表 示 与 存
“乘 R 取整”法,例如:
0.3125×2 = 0 .625 0.625 ×2 = 1 .25 0.25 ×2 = 0 .5
高位
储
0.5 ×2 = 1 .0
所以 0.312510 = 0.01012
第32页/共702页
不同进位计数制间的转换
——二信、八、十六进制的相互转换
息
的 • 每位八进制数相当于三位二进制数
表 • 每位十六进制数相当于四位二进制数
示
(1011010.10)2=(001 =(132.4)8
011
010
与 存 储
(1011010.10)2=(0101 =(5A.8)16
(F7)16=(1111 0111)2=(11110111)2
的
• 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征, 从而找出事物的共性,把具有共同性质的事物划分为一类,得出
方 法
一个抽象的概念。
• 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活 实践中抽象出的概念。
第15页/共702页
面向对象的基本概念
C语言程序设计(郑莉)课后习题答案
C语言程序设计(郑莉)课后习题答案C++语言程序设计(清华大学郑莉)课后习题答案第一章概述1-1 简述计算机程序设计语言的发展历程。
解:迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。
1-2 面向对象的编程语言有哪些特点?解:面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。
面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。
通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。
因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。
C++语言是目前应用最广的面向对象的编程语言。
1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点?解:结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。
结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。
当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。
由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。
c 程序设计基础-第九章-多态性
第9章 多态性
1 9.1 多态性的概念 2 9.2 重载、覆盖与静态联编 3 9.3 虚函数与运行时的多态 4 9.4 纯虚函数和抽象类 5 9.5 模板
3
9.1.1 面向对象程序设计中的多态
多态性是指同样的消息被不同类型的对象接收时 导致完全不同的行为。
消息:指示要调用类的某个成员函数。 行为:成员函数执行的结果被视为对象的行为。
//基类指针指向派生类
b_ptr->f();
//通过基类指针调用B::f()
}
23
二. 通过基类指针调用同名成员函数
从继承的角度来看,派生类对象是基类对象的一 个具体的特例。或者说,派生类对象是某一种特 定类型的基类对象。
例如,Circle类是Shape类的公有继承,“圆”是“图 形”的一种特例。或者说,圆是一种特定的图形,具有 图形的基本特征。
19
一.通过派生类对象调用同tangle( int aValue, int bValue ) { a=aValue; b=bValue;
} double Rectangle::getArea() const{
cout<<"Rectangle类的getArea函数,面积是 "; return a * b; } void Rectangle::print() const { cout << "hight is "<<a; cout<<"width is"<<b<<endl; }
Circle circle( 22, 8, 3.5 );
Rectangle rectangle( 10, 10 );
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– C++中预定义的运算符其运算对象只能是基本数 据类型,而不适用于用户自定义类型(如类)表达式转化为对运算符函数的调 用,运算对象转化为运算符函数的实参。 – 编译系统对重载运算符的选择,遵循函数重载 的选择原则。
6
C++语言程序设计
清华大学 郑莉
规则和限制
运 算 符 重 载
19
//8_2.cpp #include<iostream> using namespace std; class Clock //时钟类声明 { public: //外部接口 Clock(int NewH=0, int NewM=0, int NewS=0); void ShowTime(); Clock& operator ++(); //前置单目运算符重载 Clock operator ++(int); //后置单目运算符重 载 private: //私有数据成员 int Hour,Minute,Second; };
9
C++语言程序设计
清华大学 郑莉
运算符成员函数的设计
运 算 符 重 载
双目运算符 B
– 如果要重载 B 为类成员函数,使之能够实
现表达式 oprd1 B oprd2,其中 oprd1 为A
类对象,则 B 应被重载为 A 类的成员函数,
形参类型应该是 oprd2 所属的类型。
– 经重载后,表达式 oprd1 B oprd2 相当于
可以重载C++中除下列运算符外的所 有运算符: . .* :: ?: 只能重载C++语言中已有的运算符, 不可臆造新的。 不改变原运算符的优先级和结合性。 不能改变操作数个数。 经重载的运算符,其操作数中至少应 该有一个是自定义类型。
7
C++语言程序设计
清华大学 郑莉
两种形式
运 算 符 重 载
15
程序输出的结果为: c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14)
16
C++语言程序设计
清华大学 郑莉
运算符成员函数的设计
运 算 符 重 载
前置单目运算符 U
– 如果要重载 U 为类成员函数,使之能够
实现表达式 U oprd,其中 oprd 为A类对 象,则 U 应被重载为 A 类的成员函数, 无形参。 – 经重载后, 表达式 U oprd 相当于 oprd.operator U()
28
complex operator +(complex c1,complex c2) //运算符重载友元函数实现 { return complex(c2.real+c1.real, c2.imag+c1.imag);
}
complex operator -(complex c1,complex c2) //运算符重载友元函数实现 { return complex(c1.real-c2.real, c1.imag-c2.imag); } // 其它函数和主函数同例8.1
14
void complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; } void main() //主函数 { complex c1(5,4),c2(2,10),c3; //声明复数类的对象 cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3=c1-c2; //使用重载运算符完成复数减法 cout<<"c3=c1-c2="; c3.display(); c3=c1+c2; //使用重载运算符完成复数加法 cout<<"c3=c1+c2="; c3.display(); }
23
程序运行结果为: First time output: 23:59:59 Show myClock++: 23:59:59 Show ++myClock: 0:0:1
24
C++语言程序设计
清华大学 郑莉
运算符友元函数的设计
运 算 符 重 载
如果需要重载一个运算符,使之能够 用于操作某类对象的私有成员,可以 此将运算符重载为该类的友元函数。 函数的形参代表依自左至右次序排列 的各操作数。 后置单目运算符 ++和--的重载函数, 形参列表中要增加一个int,但不必写 形参名。
重载为类成员函数。 重载为友元函数。
8
C++语言程序设计
清华大学 郑莉
运算符函数
运 算 符 重 载
声明形式 函数类型 operator 运算符(形参) { ...... } 重载为类成员函数时 参数个数=原操作数个数-1(后置++、--除外) 重载为友元函数时 参数个数=原操作数个数, 且至少应该有一个自定义类型的形参。
35
C++语言程序设计
清华大学 郑莉
例 8.4
虚 函 数
#include <iostream> using namespace std; class B0 //基类B0声明 {public: //外部接口 virtual void display() //虚成员函数 {cout<<"B0::display()"<<endl;} }; class B1: public B0 //公有派生 { public: void display() { cout<<"B1::display()"<<endl; } }; class D1: public B1 //公有派生 { public: void display() { cout<<"D1::display()"<<endl; } };
25
C++语言程序设计
清华大学 郑莉
运算符友元函数的设计
运 算 符 重 载
双目运算符 B重载后, 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 ) 前置单目运算符 B重载后, 表达式 B oprd 等同于operator B(oprd ) 后置单目运算符 ++和--重载后, 表达式 oprd B 等同于operator B(oprd,0 )
– 函数重载 – 运算符重载 – 虚函数
3
C++语言程序设计
清华大学 郑莉
问题举例——复数的运算
运 算 符 重 载
class complex //复数类声明 { public: complex(double r=0.0,double i=0.0) //构造函数 { real=r; imag=i; } void display(); //显示复数的值 private: double real; double imag; };
C++语言程序设计
第八章 多态性
清华大学 郑 莉
1
C++语言程序设计
清华大学 郑莉
本章主要内容
多态性 运算符重载
虚函数
纯虚函数
抽象类
2
C++语言程序设计
清华大学 郑莉
多态性的概念
多态性是面向对象程序设计的重要特 征之一。 多态性是指发出同样的消息被不同类 型的对象接收时有可能导致完全不同 的行为。 多态的实现:
12
complex complex:: operator +(complex c2) //重载函数实现 { complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); }
13
complex complex:: operator -(complex c2) //重载函数实现 { complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); }
4
C++语言程序设计
清华大学 郑莉
问题举例——复数的运算
运 算 符 重 载
用“+”、“-”能够实现复数的加减运 算吗? 实现复数加减运算的方法 ——重载“+”、“-”运算符
5
C++语言程序设计
清华大学 郑莉
运算符重载的实质
运 算 符 重 载
运算符重载是对已有的运算符赋予多重含义 必要性
30
C++语言程序设计
清华大学 郑莉
虚函数
虚 函 数
虚函数是动态绑定的基础。 是非静态的成员函数。 在类的声明中,在函数原型之前写virtual。 virtual 只用来说明类声明中的原型,不能用在 函数实现时。 具有继承性,基类中声明了虚函数,派生类中 无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。