文档介绍:多态性(Polymorphism)是指一个名字,多种语义;或界面
相同,多种实现。
重载函数是多态性的一种简单形式。
虚函数允许函数调用与函数体的联系在运行时才进行,称为
动态联编。
第8章虚函数与多态性
静态联编
类指针的关系
虚函数与动态联编
纯虚函数与抽象类
虚函数和多态性的应用
小结
第8章虚函数与多态性
联编是指一个程序模块、代码之间互相关联的过程。
静态联编,是程序的匹配、连接在编译阶段,也称为早期匹配。
重载函数使用静态联编。
动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编。
switch 语句和 if 语句是动态联编的例子。
静态联编
静态联编
普通成员函数重载可表达为两种形式:
1. 在一个类说明中重载
例如: Show ( int , char ) ;
Show ( char * , float ) ;
静态联编
普通成员函数重载可表达为两种形式:
1. 在一个类说明中重载
例如: Show ( int , char ); 与
Show ( char * , float ); 不是同一函数,编译能够区分
2. 基类的成员函数在派生类重载。有 3 种编译区分方法:
(1)根据参数的特征加以区分
静态联编
普通成员函数重载可表达为两种形式:
1. 在一个类说明中重载
2. 基类的成员函数在派生类重载。有 3 种编译区分方法:
(1)根据参数的特征加以区分
例如: A :: Show ( );
有别于 B :: Show ( );
(2)使用“:: ”加以区分
静态联编
普通成员函数重载可表达为两种形式:
1. 在一个类说明中重载
2. 基类的成员函数在派生类重载。有 3 种编译区分方法:
(1)根据参数的特征加以区分
(2)使用“:: ”加以区分
例如: Aobj . Show ( ) 调用 A :: Show ( )
Bobj . Show ( ) 调用 B :: Show ( )
(3)根据类对象加以区分
基类指针和派生类指针与基类对象和派生类对象4种可能匹配:
直接用基类指针引用基类对象;
直接用派生类指针引用派生类对象;
用基类指针引用一个派生类对象;
用派生类指针引用一个基类对象。
类指针的关系
类指针的关系
例如:
A * p ; // 指向类型 A 的对象的指针
A A_obj ; // 类型 A 的对象
B B_obj ; // 类型 B 的对象
p = & A_obj ; // p 指向类型 A 的对象
p = & B_obj ; // p 指向类型 B 的对象,它是 A 的派生类
利用 p,可以通过 B_obj 访问所有从 A_obj 继承的元素,
但不能用 p访问 B_obj 自身特定的元素(除非用了显式类型转换)
class A
class B : public A
基类指针引用派生类对象
基类指针引用派生类对象
#include<>
#include<>
class A_class
{ char name[20] ;
public : void put_name( char * s ) { strcpy( name, s ) ; }
void show_name() { cout << name << "\n" ; }
};
class B_class : public A_class
{ char phone_num[ 20 ] ;
public : void put_phone( char * num ) { strcpy ( phone_num , num ) ; }
void show_phone() { cout << phone_num << "\n" ; }
};
void main()
{ A_class * A_p ; A_class A_obj ;
B_class B_obj ;
A_p = & A_obj ;
A_p -> put_name( "Wang xiao hua" ) ; A_p -> show_name() ;
A_p = & B_obj ;
A_p -> put_name( "Chen ming" ) ; A_p -> show_name() ;
( "5555_12345678" );
( ( B_class * ) A_p ) -> show_phone() ;
}
例8-1 使用基类指针引用派生