结合9.20日所学的继承,多重继承及指针等相关知识,对多态及虚函数进行学习,主要练习为图形类的多态、虚函数的实际应用。
多态性:
1.多态性的概念:
多态性是面向对象程序设计的第三个重要特征。
多态性是指发出同样的消息被不同类型的对象接收时导致完全不同的行为。
消息——主要指对类的成员函数的调用。
多态的实现:
函数重载
运算符重载
虚函数
2 运算符重载:
C++运算符重载的实质:
运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函数来完成不同的基本操作。要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数形式:
函数类型 operator 运算符(形参表) �{ � 函数体; �}
*补充:c++中别名&*:
int n;
int &m = n;
在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,对n来说是一样的。
对于引用,有以下三条规则:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化);
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL);
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
3.静态联编与动态联编:
联编:
程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。
静态联编(静态束定)
联编工作出现在编译阶段,用对象名或者类名来限定要调用的函数。
动态联编
联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。
**4. 虚函数**
(1)虚函数是动态联编的基础。
是非静态的成员函数。
在类的声明中,在函数原型之前写virtual。
virtual 只用来说明类声明中的原型,不能用在函数实现时。
具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
(2)本质:不是重载声明而是覆盖。
调用方式:通过基类指针或引用,执行时会�根据指针指向的对象的类,决定调用哪个函数。
(3)在基类的成员函数前加virtual关键字表示这个函数是一个虚函数
所谓虚函数就是在编译的时候不确定要调用哪个函数,而是动态决定将要调 用哪个函数
要实现虚函数必须派生类的函数名与基类相同,参数名参数类型等也要与基类相同。但派生类中的virtual关键字可以省略,也表 示这是一个虚函数。
一般使用时声明一个基类的指针(必须是基类,反之则不行)p,把p指向派生类的对象实例,调用虚函数,这 时系统会判断p所指向的实例的类型,如果是A类的实例就调用A类的同名函数执行,如果是B类的实例就调用B类的同名函数。
(4)一个函数一旦被说明为虚函数
则无论说明它的类被继承了多少层,在每一层派生类中该函数都保持virtual特性。因此,在派生类中重新定义该函数时,不再需要关键字virtual。
但习惯上,为了提高程序的可读性,常常在每层派生类中都重复地使用virtual关键字。