多态相关注意事项
所谓的多态就是指函数有多中状态, 在C++中通常是通过父类指针指向子类对象的方法实现多态, 这样父类可以通过子类的类型调用不同的方法. 即实现一个接口多种方法, 多态的引用是为了实现接口复用
在 C++中多态是通过虚函数来实现的. 子类通过对父类相关接口进行重写实现一个接口多种状态. 虚函数允许子类对父类相关接口进行重写,
多态性的条件:
派生类的虚函数必须和基类的虚函数函数名相同, 参数相同, 返回值相同
只有类的成员函数才能实现虚函数. 静态成员函数, 内联函数都不能成为虚函数
构造函数不能为虚函数
析构函数才能定义为虚函数
指针或者引用才能实现多态
动态联编和静态联编
所谓的静态联编就是编译器在编译的时候就已经 确定了要执行那个函数, 而所谓的动态联编就是程序在运行的时候才根据对象的类型确定执行那个函数接口
#include"iostream.h"class A{public:voidf(){cout<<"A"<<"";}};classB:publicA{public:voidf(){cout<<"B"<<endl;}};Void main(){A*pa=NULL;Aa;Bb;pa=&a;pa->f();pa=&b;pa->f();}
此时没有构成重载, 因此在编译的时候通过指针的类型来判断函数调用那个接口, 此时的对象是a, 属于A类型的一个指针, 因此执行结果便是两个A. 要想实现当指针指向不同对象时执行不同的操作,就必须将基类中相应的成员函数定义为虚函数,进行动态联编
动态联编
程序在运行的时候通过对象的类型来根据当时的情况动态的决定要执行那个接口函数. 在C++动态联编只能通过父类指针或者父类引用调用虚函数才能实现动态联编
#include"iostream.h"classA{public:Virtual voidf()//虚函数{cout<<"A"<<"";}};classB:publicA{public:Virtual voidf()//虚函数{cout<<"B"<<endl;}};voidmain(){ A*pa=NULL;Aa;Bb;pa=&a;pa->f();//Apa=&b;pa->f();//B}