从0到1入门C++编程——06 类和对象之多态、文件操作

多态

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西岸贤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值