首页 > 其他分享 >47.多态

47.多态

时间:2023-02-23 20:33:32浏览次数:36  
标签:mA mB int 47 pro 多态 public

1.多态基本概念

  多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。

  多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将”what”和”how”分离开来。多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展而且当项目在需要有新的功能时也能扩展

  c++支持编译时多态(静态多态)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。

  静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。

//计算器
class Caculator{
public:
	void setA(int a){
		this->mA = a;
	}
	void setB(int b){
		this->mB = b;
	}
	void setOperator(string oper){
		this->mOperator = oper;
	}
	int getResult(){
		
		if (this->mOperator == "+"){
			return mA + mB;
		}
		else if (this->mOperator == "-"){
			return mA - mB;
		}
		else if (this->mOperator == "*"){
			return mA * mB;
		}
		else if (this->mOperator == "/"){
			return mA / mB;
		}
	}
private:
	int mA;
	int mB;
	string mOperator;
};

//这种程序不利于扩展,维护困难,如果修改功能或者扩展功能需要在源代码基础上修改
//面向对象程序设计一个基本原则:开闭原则(对修改关闭,对扩展开放)

//抽象基类
class AbstractCaculator{
public:
	void setA(int a){
		this->mA = a;
	}
	virtual void setB(int b){
		this->mB = b;
	}
	virtual int getResult() = 0;
protected:
	int mA;
	int mB;
};

//加法计算器
class PlusCaculator : public AbstractCaculator{
public:
	virtual int getResult(){
		return mA + mB;
	}
};

//减法计算器
class MinusCaculator : public AbstractCaculator{
public:
	virtual int getResult(){
		return mA - mB;
	}
};

//乘法计算器
class MultipliesCaculator : public AbstractCaculator{
public:
	virtual int getResult(){
		return mA * mB;
	}
};

void DoBussiness(AbstractCaculator* caculator){
	int a = 10;
	int b = 20;
	caculator->setA(a);
	caculator->setB(b);
	cout << "计算结果:" << caculator->getResult() << endl;
	delete caculator;
}

2.视频内容

程序1:

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2022年10月18日20:03:17
#include <iostream>
using namespace std;

class People
{
public:
    //虚函数
    virtual void Mypro()
    {

    }
};

class wangzhaojun:public People
{
public:
    //重写父类的虚函数
    virtual void Mypro()
    {
        cout << "约王昭君" << endl;
    }
};

class diaochan:public People
{
public:
    //重写父类的虚函数
    virtual void Mypro()
    {
        cout << "约貂蝉" << endl;
    }
};

class xishi :public People
{
public:
    //重写父类的虚函数
    virtual void Mypro()
    {
        cout << "约西施" << endl;
    }
};

//同一个操作
void doLogin(People *pro)
{
    pro->Mypro();
}

void test()
{
    People *pro = NULL;
    pro = new xishi;
    doLogin(pro);//不同的对象
    delete pro;

    pro = new wangzhaojun;
    doLogin(pro);//不同的对象
    delete pro;

    pro = new diaochan;
    doLogin(pro);//不同的对象
    delete pro;
}
int main()
{
    test();

    system("pause");
    return EXIT_SUCCESS;
}

输出结果:

约西施
约王昭君
约貂蝉
请按任意键继续. . .


1.多态(重点难点)

1.什么是多态:

同一个操作作用于不同的对象,可以有不同的解释,会产生不同的效果,这就是多态。

2.多态有什么用

1.可以解决项目中的紧耦合问题,提供程序的可扩展性

2.应用程序不必为每一个子类的功能调用编写代码,只需要对抽象的父类进行处理

3.多态发生的三个条件

1.有继承。2.重写父类的虚函数。3.父类指针指向子类对象

参考资料

参考资料来源于黑马程序员等

标签:mA,mB,int,47,pro,多态,public
From: https://www.cnblogs.com/codemagiciant/p/17149301.html

相关文章

  • 洛谷P8471 [Aya Round 1 F] 琪露诺的选择题
    原题传送门题目描述有2⋅n道选择题,每题有A和B两个选项。正确答案可以表示为一个长度为2⋅n的字符串。现在你要构造出一份作答(长度同样为2⋅n的字符串),其中恰好......
  • 【算法训练营day57】LeetCode647. 回文子串 LeetCode516. 最长回文子序列
    LeetCode647.回文子串题目链接:647.回文子串独上高楼,望尽天涯路直接看题解。慕然回首,灯火阑珊处首先是确定dp数组以及下标的含义。布尔类型的dp[i][j]:表示区间范围......
  • 多态
    多态:同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时会产生不同的行为重载实现编译时多态,虚函数实现运行时多态基类的指针指向派生类的对象,......
  • 力扣简2347 最好的扑克手牌
    暴力求解但是忽略了三条中的2=3=4的情况后面写着写着想了想可以构建一个数组又觉得占内存还是暴力解了publicstaticStringbestHand(int[]ranks,char[]su......
  • [bzoj 1471] 不相交路径 (容斥原理)
    题目描述给出一个结点的有向无环简单图。给出个不同的点,,,,定义不相交路径为两条路径,两条路径的起点分别为和,对应的两条路径的终点为和,要求满足这两条路径不相交,即两条路径上没......
  • 多态
    子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。构建子类对象时......
  • 【LeetCode】2347. 最好的扑克手牌
    classSolution{public:stringbestHand(vector<int>&ranks,vector<char>&suits){intsameNum=0;if(count(suits.begin(),suits.end(),su......
  • [LeetCode] 2347. Best Poker Hand
    Youaregivenanintegerarray ranks andacharacterarray suits.Youhave 5 cardswherethe ith cardhasarankof ranks[i] andasuitof suits[i].......
  • java环境搭建问题之——此环境变量太大。此对话框允许将值设置为最长2047个字符。“
    系列文章目录文章目录​​系列文章目录​​​​前言​​​​一、解决办法​​​​办法二​​前言安装完jdk1.8,之后,要添加环境变量,之前添加都没事,突然就加不了了,情况很急,这......
  • 力扣---2347. 最好的扑克手牌
    给你一个整数数组ranks和一个字符数组suit。你有5张扑克牌,第i张牌大小为ranks[i],花色为suits[i]。下述是从好到坏你可能持有的手牌类型:   "Flush":同花,五......