多态性有两种静态多态性和动态多态性,
静态多态性是指调用同名函数,由于参数的不同调用不同的同名函数;
动态多态性是指不同对象调用同名函数时,由于对象不同调用不同的同名函数。
静态联编和动态联编
- 联编是指一个程序模块、代码之间互相关联的过程。
- 静态联编,是程序的匹配、连接在编译阶段实现,也就是说在你写完代码的时候,程序的运行顺序就已经确定了,也称为早期匹配。 重载函数使用静态联编。
- 动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编。动态联编主要依赖虚函数和基类指针。(具体怎么解释我还没想好) switch 语句和 if 语句是动态联编的例子(?)。虚函数重载使用动态联编。
- 重载的意思就是同名,但是实现功能不同(参数的类型和数量有参的时候不一样,无参的时候就只能基类与派生类之间允许同名,否则在同一个函数作用域中写,就相当于函数重定义,会报错的)
普通成员函数的重载可以分为两种形式:即有参和无参,同一类和派生类中。
有参的在同一类中直接看参数类型与个数,在基类与派生类中若是参数类型与个数不相同,直接看即可;若是相同就用作用域运算符或类对象的名字直接加以区分。
无参的同一类中写了几个函数名相同,没参数,会报错;在基类与派生类中(这应该也许叫做重定义函数)还是老一套的用作用域运算符或类对象的名字直接加以区分。(主要是因为同名,因为类对象调用的时候显示的是,例如:a.show(),这样就对函数的返回类型要求基本没有,主要针对名字和参数)
类指针的关系
- 基类指针和派生类指针与基类对象和派生类对象4种可能匹配:
直接用基类指针引用基类对象;
直接用派生类指针引用派生类对象;
用基类指针引用一个派生类对象;
(指针的访问能力高于对象能力)
用派生类指针引用一个基类对象。
(指针的访问能力低于对象能力) - 用基类指针引用派生类对象
使p成为基类指针,A是基类,B是派生类。
利用 p,可以访问B_obj 的所有从 A 类继承的元素 ,
但不能用 p访问 B 类自定义的元素 (除非用了显式类型转换)(也就是对基类指针进行强制类型转换)
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"