C++类多态

在这里插入图片描述
静态多态和动态多态

以下代码是地址早绑定:

#include<iostream>
#include<string>

using namespace std;


class Animal
{
public:
	void speak()
	{
		cout << "动物在说话" << endl;
	}
};

class Cat :public Animal
{
	void speak()
	{
		cout << "猫在说话" << endl;
	}
};

//执行说话函数
void doSpeak(Animal &animal)
{
	animal.speak();
}
void test01()
{
	Cat cat;
	doSpeak(cat);

}


int main(void)

{
	test01();
	system("pause");
	return 0;
}


在这里插入图片描述可以看到打印出来的并不是我们本来想要打印的内容
在编译阶段却动函数地址

动态多态
地址晚绑定
在这里插入图片描述

class Animal
{
public:
	virtual void speak()
	{
		cout << "动物在说话" << endl;
	}
};

//动态多态
//重写 函数返回值类型 函数名 参数列表 完全相同

//动态多态使用
//父类的指针或者引用 执行类对象


虚函数指针
vfptr
虚函数表
vftable
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<string>

using namespace std;


class Animal
{
public:
	virtual void speak()
	{
		cout << "动物在说话" << endl;
	}
};

class Cat :public Animal
{
	void speak()
	{
		cout << "猫在说话" << endl;
	}
};

//执行说话函数
void doSpeak(Animal &animal)
{
	animal.speak();
}
void test01()
{
	Cat cat;
	doSpeak(cat);

}



int main(void)

{
	test01();
	system("pause");
	return 0;
}

//动态多态
//重写 函数返回值类型 函数名 参数列表 完全相同


在这里插入图片描述

#include<iostream>
#include<string>

using namespace std;

//普通写法
class Caculator
{
public:
	int m_Num1;//操作数1
	int m_Num2;//操作数2

	int getResult(string ope)
	{
		if (ope == "+")
		{
			return m_Num1 + m_Num2;
		}
		else if (ope == "-")
		{
			return m_Num1 - m_Num2;
		}
		else if (ope == "*")
		{
			return m_Num1 * m_Num2;
		}	
	}
};

//利用多态实现计算器
class AbstractCalculator
{
public:
	virtual int getResult()
	{
		return 0;

	}
	int m_Num1;//操作数1
	int m_Num2;//操作数2
};


//加法计算器类
class Addcalculator :public AbstractCalculator
{
public:
	int getResult()
	{
		return m_Num1 + m_Num2;
	}
};

//减法计算器类
class Subcalculator :public AbstractCalculator
{
public:
	int getResult()
	{
		return m_Num1 - m_Num2;
	}
};

//乘法计算器类
class Mulcalculator:public AbstractCalculator
{
public:
	int getResult()
	{
		return m_Num1 * m_Num2;
	}
};

void test01()
{
	//创建对象
	Caculator c;
	c.m_Num1 = 10;
	c.m_Num2 = 10;
	cout << c.m_Num1 << " + " << c.m_Num2 << " = " << c.getResult("+") << endl;
	cout << c.m_Num1 << " - " << c.m_Num2 << " = " << c.getResult("-") << endl;
	cout << c.m_Num1 << " * " << c.m_Num2 << " = " << c.getResult("*") << endl;

	//如果想扩展新的功能,需求修改源码
	//在真是开发中 提倡 开闭原则
	//开闭原则:对扩展进行开发,对修改进行关闭
}

void test02()
{
	//多态的使用条件
	//父类指针或者引用指向子类对象
	AbstractCalculator *abc = new Addcalculator;
	abc->m_Num1 = 10;
	abc->m_Num2 = 10;
	cout << abc->m_Num1 << " + " << abc->m_Num2 << " = " << abc->getResult() << endl;
	delete abc;
}
int main(void)

{
	//test01();
	test02();
	system("pause");
	return 0;
}

总结:C++开发提倡利用多态设计程序架构,因为多态有点很多

在这里插入图片描述
当类中有了纯虚函数,这个类也称为抽象类。

在这里插入图片描述
在这里插入图片描述
纯虚虚构
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值