内容正文:
多态性和虚函数
多态性是面向对象程序设计的重要特征之一。所谓多态,是指当不同对象收到相同消息时会产生不同的行为。C++的多态性具体体现在运行和编译两个方面。在程序编译时,多态性体现在函数和运算符的重载上,这种多态也称静态多态性;在程序运行时,多态性体现在继承和虚函数上,这种多态也称动态多态性。
基类和派生类的同名函数可以通过对象名调用,但为了统一调用形式,可以用基类指针调用。C++系统使用虚函数的方法,使基类指针能在程序执行时确定调用基类还是派生类的同名函数。
当虚函数被多个派生类重写,基类中的虚函数体失去意义时,可定义基类中的虚函数为纯虚函数。包含纯虚函数的类称为抽象类。抽象类不能建立对象,但为派生类提供了接口。
目录
第9章
C++程序设计案例教程
9.1 多态性和虚函数
Add your text in here
Click to add Text
分别用对象名和指针变量调用基类和
派生类中的同名函数
案例引入
建立有继承关系的两个类,这两个类中包含同名且参数一致的函数。用派生类对象分别调用基类和派生类中的同名函数,再用指针变量代替基类对象和派生类对象调用同名函数,观察程序的运行结果。
9.1.1 多态性
目录
第9章
C++程序设计案例教程
9.1.1 多态性
源代码展示
#include <iostream>
using namespace std;
class Graph
{
protected:
int len;
public:
Graph(int i)
{
len=i;
}
void display()
{
cout<<"len="<<len<<endl;
}
};
……
目录
第9章
C++程序设计案例教程
9.1.1 多态性
运行结果
目录
第9章
C++程序设计案例教程
9.1.1 多态性
程序分析
程序中的两个类是继承的层次关系。这两个类中包含名字相同、参数相同(都无参)的成员函数display()。派生类Rectangle继承基类Graph后,就屏蔽了基类的同名函数。
程序执行时,可以通过对象名调用函数display()。当派生类对象调用此函数时,调用的是自己的display()。如果要通过派生类对象调用基类的函数display(),需要在调用函数前增加类名,例如:
r.Graph::display();
当然,可以使用指针变量代替对象名调用函数。如果使用指针变量,可以随时将执行对象的地址赋给指针。这样一来,无论对象是什么,代码都可以统一采用p->display()的形式。
目录
第9章
C++程序设计案例教程
知识讲解
在继承的机制中,派生类新增的成员函数很可能与继承得来的基类的成员函数同名,并且参数个数和参数类型也相同,因此,这种现象不属于函数重载。如果用派生类对象调用同名的成员函数,派生类会屏蔽继承的基类的成员函数,执行自己新增的成员函数。如果要用派生类对象调用继承的基类同名函数,需要在函数前增加基类名。
调用了名字相同的函数,却执行了不同的结果,这体现了C++的多态性。
目录
第9章
C++程序设计案例教程
9.1.2 虚函数的使用
Add your text in here
Click to add Text
建立虚函数,用基类指针访问派生类的同名函数
案例引入
修改9.1.1案例,在基类中,将与派生类函数同名的函数修改为虚函数。
目录
第9章
C++程序设计案例教程
9.1.2 虚函数的使用
源代码展示
#include <iostream>
using namespace std;
class Graph
{
protected:
int len;
public:
Graph(int i):len(i){}
virtual void display()
{
cout<<"len="<<len<<endl;
}
};
class Rectangle:public Graph
{
private:
int width;
public:
Rectangle(int l,int w):Graph(l),width(w){}
void display()
{
cout<<"area="<<len<<"*"<<width<<"="<<len*width<<endl;
}
};
int main()
{
Graph *p;
Rectangle r(1,2);
p=&r;
p->display ();
return 0;
}
目录
第9章
C++程序设计案例教程
9.1.2 虚函数的使用
运行结果
程序分析
如何通过基