计算机程序设计c++ 12-1:多态性基本概念

多态性含义

多态指相同语法结构,代表多种功能或操作
例如:X+Y

  • X和Y都为整数类型:相加操作先以个位对齐,然后对应位相加
  • X和Y都为浮点类型:相加操作先以小数点对齐,然后对应位相加
  • 当然+两边可以为不同类型也可以相加,比如虚数相加

例如:datatype max(datatype a, datatype b)

  • a和b都为整数,可以直接用关系运算符判断比较得出最大值
  • a和b都为日期对象,判断比较操作较为复杂
  • 能否将max()函数重载,求两个新类的对象的大小

无论 X + Y X+Y X+Y还是datatype max(datatype a,datatype b)

  • 都实现了一种语法格式,隐含了多种操作,这就是多态
  • 多态实现了“一种接口,多种方法”
  • 具体地讲就是将运算符重载,将函数重载,实现不同功能

多态性的两种形式

编译时多态性
  • 编译器对源程序进行编译时就可以确定所调用的是哪一个函数
  • 编译时多态性通过重载来实现
  • 函数重载
  • 运算符重载
运行时多态性
  • 在程序运行过程中根据具体情况来确定调用的是哪一个函数
  • 运行时多态通过虚函数来实现

编译时多态

兔子类

class 兔子
{
	public:
		void 逃生(老鹰 a){"兔子蹬鹰"}
		void 逃生(老狼 b){"动如脱兔"}
}void main()
{
	兔子 rabbit;
	老鹰 eagle;
	老狼 wolf;
	rabbit.逃生(eagle);
	rabbit.逃生(wolf);
}

逃生函数是重载函数,相同函数名
在调用函数时,传入的参数类型在编译时就确定

最大类

#include<iostream>

using namespace std;

char max_( char x, char y ) { return x>y ? x : y; }

int max_( int x, int y ) { return x>y ? x : y; }

float max_( float x, float y ) {return x>y ? x : y; }

void main()
{
	float a=3.14, b=2.718;
	cout <<	"d与s:" << max_('d', 's') << "大" << endl;	  // 字符类比较
	cout << "28与168:" << max_(28, 168) << "大" << endl;  // 整数类比较
	cout << "3.14与2.718:" << max_(a, b) << "大" << endl; // 浮点数比较
}

在这里插入图片描述

运行时多态

#include<iostream>

using namespace std;

class pet
{
	public:
		virtual void speak() {cout<<"zzz"<<endl;};
};

class cat : public pet
{
	public:
		void speak() { cout<< "miao!miao!"<<endl; }
};

class dog : public pet
{
	public:
		void speak() { cout<< "wang!wang!"<<endl; }
};


void main()
{
	pet pet1, *p=&pet1; //p为宠物类指针
	cat cat1; //定义猫类对象
	dog dog1; //定义狗类对象
	int x; //根据用户输入将猫或狗对象地址赋给p指针,
	cin >> x; //石头扔的远近,只有扔了才知道效果
	if(x==1) p = &cat1; //例如用户输入1 ,则执行猫对象地址赋给p
	if(x==2) p = &dog1; //例如用户输入2,则执行猫对象地址赋给p
	p->speak(); //究竟运行哪个函数,只有运行时才知道
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意: 0的时候 就输入基类中的成员函数
其中基类中pet中有一个关键字virtual,表明是虚函数
有virtual修饰的函数,在基类指针指向派生类对象或者基类引用以派生类对象赋值时调用派生类的函数,无virtual修饰时只会调用基类的函数
一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。下面是设置虚函数的注意事项:
1.只有类的成员函数才能声明为虚函数
2.静态成员函数不能使虚函数,因为它不受限于某个对象
3.内联函数不能使虚函数
4.构造函数不能是虚函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

uncle_ll

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

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

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

打赏作者

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

抵扣说明:

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

余额充值