多态的类型:分为4类,重载多态,强制多态,包含多态,参数多态。
以前所学过的普通函数的重载也属于重载多态。强制多态是指将一个变元的类型加以变化,以符合一个函数或操作的要求,比如int型与float型相加,要先进行类型转换。
多态的实现:分为两类,编译时的多态与运行时的多态。
前者在编译的过程中确定了同名的具体操作对象,而后者是在程序运行过程中才多态地确定操作所指向的对象。这种确定操作具体对象的过程就是绑定。绑定工作在编译连接阶段完成的情况为静态绑定,在程序运行过程中完成的情况是动态绑定。
运算符重载
运算符重载时对已有的运算符赋予多重含义,使同一个运算符作用于不同的数据类型时有不同的行为。
重载形式
重载为类的非静态成员函数,重载为非成员函数。
两种重载方式的声明语法形式一般相同
都为
返回类型 operator 运算符(形参表)
{
函数体
}
非成员函数一般定义为友元函数。
**实现‘+’的重载** #include<iostream> using namespace std; class counter { private: float a; public: counter(float a=0):a(a){} counter operator+(counter& c)const { **//定义为类的非静态成员函数** return counter(a + c.a); } //friend counter operator+(counter& c1,counter& c2); **//定义为非成员函数** void print()const { cout <<"和为:"<< a << endl; } }; /*counter operator+(counter& c1, counter& c2) { return counter(c1.a + c2.a); }*/ int main() { float i, j; cout << "输入要相加的两个数:"; cin >> i >> j; counter c1(i),c2(j),c3; c3 = c1 + c2; c3.print(); return 0; }
虚函数
声明语法 virtual 函数类型 函数名(形参表);virtual关键词只能在声明时出现,函数实现时不能出现。
派生类的虚函数关键词virtual,当与基类的虚函数相同,可以省略。此时,派生类的虚函数会覆盖基类的虚函数,以及基类中同名函数的其他重载形式。基于这一特性,虚函数主要用来处理同一类族中不同的对象。
#include<iostream> using namespace std; class BaseClass { public: virtual void fun1() { cout << "调用BaseClass::fun1" << endl; } void fun2() { cout << "调用BaseClass::fun2" << endl; } }; class DerivedClass :public BaseClass {![](https://img2018.cnblogs.com/blog/1784291/201910/1784291-20191026225036711-1317513051.png) public: void fun1() { cout << "调用DerivedClass::fun1" << endl; } void fun2() { cout << "调用DerivedClass::fun2" << endl; } }; void print(BaseClass *p) { p->fun1(); p->fun2(); } int main() { DerivedClass c2; print(&c2); }
代码中是将派生类对象的地址传给基类指针*p,输出为派生类的的虚函数的执行,说明派生类的虚函数将基类的虚函数覆盖掉了
纯虚函数
声明语法 virtual 函数类型 函数名 (形参表)=0;与虚函数不同的是,纯虚函数在基类中不需要实现。它是抽象类的标志。
抽象类
如上,它必定带有纯虚函数。抽象类的作用是通过他为一个类族传建一个公共的接口。由于派生类的虚函数会覆盖积累的虚函数,在声明纯虚函数后,相当于纯虚函数的函数体由派生类的虚函数来实现,使它们能够更有效地发挥多态特性。
#include<iostream> using namespace std; class base1 { public: virtual void display()const = 0;//定义纯虚函数 }; class base2:public base1{ public: void display()const { cout << "baseclass \n"; } }; void print(base1* p) { p->display(); } int main() { //#include<iostream> using namespace std; class base1 { public: virtual void display()const = 0; }; class base2:public base1{ public: void display()const { cout << "baseclass \n"; } }; void print(base1* p) { p->display(); } int main() { //baseclass1 A1; base2 A2; print(&A2);//与虚函数相同,通过指针或引用来调用纯虚函数 return 0; }
在主函数中加入baseclass1 A1;会报错
说明纯虚函数不能实例化,也就是不能有实际对象。