文章目录
多态
1.多态基本概念
多态是C++面向对象的三大特性之一。
多态分为静态多态和动态多态,静态多态包括函数重载和运算符重载等,动态多态是指派生类和虚函数实现运行时多态。
静态多态和动态多态的区别:静态多态的函数地址是早绑定的,其在编译阶段就已经确定了函数的地址;动态多态的函数地址是晚绑定的,其在运行阶段才确定函数地址。
函数重写:父类和子类中函数返回值类型、函数名、参数列表完全相同。
动态多态需要满足的条件:有继承关系;子类重写父类的虚函数。
动态多态使用时,父类的指针或引用指向子类的对象。
子类重写父类虚函数,虚函数表指针会将父类的函数表指针替换成本类的;如果不重写父类虚函数,子类将继承父类函数表指针,其指向的函数地址仍是父类的。
多态的简单代码示例如下。
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void speak() //通过虚函数实现地址晚绑定,vfptr是一个虚函数表指针
{
cout<<"Animal speak()"<<endl;
}
};
class Cat : public Animal
{
public:
void speak() //子类重写父类虚函数,虚函数表指针会将父类的替换成本类的
{
cout<<"Cat speak()"<<endl;
}
};
class Dog : public Animal
{
public:
void speak()
{
cout<<"Dog speak()"<<endl;
}
};
void dospeak(Animal &animal) //父类的引用可以指向子类对象
{
animal.speak();
}
void fun()
{
Cat cat;
cat.speak();
dospeak(cat); //传哪个对象就执行这个对象所在类的函数
Dog dog;
dospeak(dog);
}
int main()
{
fun();
system("pause");
return 0;
}
上面代码的执行结果如下图所示。
2.多态案例——计算器
多态的优点:代码组织结构清晰;可读性强;利于前期和后期的扩展及维护。
利用普通方法实现计算器的代码如下。
#include <iostream>
#include <string>
using namespace std;
class Calculator
{
public:
int getResult(string str)
{
if(str == "+")
return num1+num2;
else if(str == "-")
return num1-num2;
else if(str == "*")
return num1*num2;
else if(str == "/")
{
if(num2 != 0)
return num1/num2;
else
cout<<"除数不能为0!"<<endl;
}
}
int num1;
int num2;
};
void fun()
{
Calculator c;
c.num1 = 10;
c.num2 = 20;
cout<<c.num1<<"+"<<c.num2<<"="<<c.getResult("+")<<endl;
cout<<c.num1<<"-"<<c.num2<<"="<<c.getResult("-")<<endl;
cout<<c.num1<<"*"<<c.num2<<"="<<c.getResult("*")<<endl;
cout<<c.num1<<"/"<<c.num2<<"="<<c.getResult("/")<<endl;
}
int main()
{
fun();
system("pause");
return 0;
}
利用多态方法实现计算器的代码如下。
#include <iostream>
#include <string>
using namespace std;
//计算器的抽象类
class AbstractCalculator
{
public:
virtual int getResult()
{
return 0;
}
int num1;
int num2;
};
//加法计算器类
class AddCalculator : public AbstractCalculator
{
public:
int getResult()
{
return num1+num2;
}
};
//减法计算器类
class SubCalculator : public AbstractCalculator
{
public:
int getResult()
{
return num1-num2;
}
};
//乘法计算器类
class MultiCalculator : public AbstractCalculator
{
public:
int getResult()
{
return num1*num2;
}
};
//除法计算器类
class DivCalculator