C++ 基础语法&特性(5)-面向对象之多态和虚函数
多态,是指同样的事物,有不同的状态
C++的多态有两种
1、编译时多态
函数和运算符重载,是静态多态
2、运行时多态
对象指针赋值兼容情况下,根据对象实际类型调用虚函数,而不是根据变量类型(普通成员函数是通过指针类型判断)
3、虚函数
class 多态类基类名{ //包含虚函数的类称为多态类 public: //静态函数不能为虚函数(静态函数与对象无关,与类有关) //友元函数不能为虚函数(友元本就不是成员) //尽量不要声明为inline virtual 返回值类型 方法名V(参数表){ //virtual只在声明时用,定义时不写 //派生类即使重写,也是虚函数 } }; /* [virtual] 虚基类 多重继承+多层继承下,对间接基类访问具有二义性 A B C(B/C虚继承A) D (D同时继承B、C时访问A不会出错) */ class 派生类名 : [virtual] 继承方式说明符 多态类基类名 { public: virtual 返回值类型 方法名V(参数表){ //无论是否有virtual都是虚函数 } /* 抽象类/函数 虚函数,≈抽象函数,派生类必须重写此函数 纯虚函数的类称为抽象类(无法实例化,可以有此类型指针) */ virtual 返回值类型 函数名(参数表)=0; 返回值类型 方法名T(){ //函数里可调用虚函数,依然具有多态性 } //重载操作符函数不建议虚函数(容易混乱) /* 构造函数和析构函数里 尽量别调用虚函数,对象不完整,不具有多态性 */ 类名(); //构造函数不能定义为虚函数 virtual ~类名(); //基类的析构函数建议定义为虚函数,可以根据对象实际类型调用析构函数 }; //区分:使用基类指针或引用调用虚函数(其他情况不算多态) 子类类型 变量1; 基类类型 变量2; //不算,通过对象调用虚函数,类型已确定,编译器预绑定 基类类型 &变量3=变量1; //此时调用虚函数是多态 基类类型 *变量4; //多态
欢迎各位指点!