一、多态的认识

1.1多态的概念

多态:指同一操作作用于不同对象时,可以产生不同的行为。 多态允许通过统一的接口处理不同类的对象,提高代码的灵活性和可扩展性。

1.2多态的类型
  1. 编译时多态(静态多态):主要表现就是函数重载函数模板,他们均通过传递不同的参数,从而调用不同的函数来达到不同的状态——这称之为编译时多态。(因为他们实参传给形参的参数匹配是在编译时完成的)
  2. 动态多态(运行时多态):通过方法重写实现,当调用相同方法时,传入不同对象会触发不同的具体实现,从而表现出多种行为形态——这称之为动态多态。(重写在后面会介绍)

举个例子: 比如父类有一个买票的函数,而对于买票这个行为,当普通成年人去买票时,买的是全价票;如果是一个学生去买票,买到的就是折扣票。所以至于最终买到的是什么票是取决于传递的是什么对象来决定的!

二、多态的定义及实现

2.1多态的构成条件

多态是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的行为。比如Student继承了PersonPerson对象买票全价,Student对象优惠买票。

代码语言:javascript

AI代码解释

#include<iostream>
using namespace std;

class Person
{
public:
	void BuyTickt()
	{
		cout << "买票-全价" << endl;
	}
};

class Student :public Person
{
public:
	void BuyTickt()
	{
		cout << "买票-打折" << endl;
	}

};

void Func(Person& p)
{
	p.BuyTickt();
}

int main()
{
	Person p;
	Student s;

	Func(p);//传一个Person对象
	Func(s);//传一个Student对象
	return 0;
}

在这里插入图片描述

在这里插入图片描述

我们想通过传入不同的对象,来得到不同的结果,但是发现与我们的预期不符。 原因是Func函数接受Person&类型的参数,调用BuyTickt时根据参数的静态类型(Person)决定调用哪个方法。即使传入的是Student对象,调用的仍是基类PersonBuyTickt方法。由此说明该函数编译时就已经确定了函数的地址了,不由对象决定!因此可以发现他们是不构成多态的!!!

2.2多态的实现

所以要想实现多态还必须要加上这两个重要的条件:

  • 必须是基类的指针或者引用调用虚函数。
  • 被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖。

代码语言:javascript

AI代码解释

#include<iostream>
using namespace std;

class Person
{
public:
//在前面加上virtual变成虚函数
	virtual void BuyTickt()
	{
		cout << "买票-全价" << endl;
	}
};

class Student :public Person
{
public:
//在前面加上virtual变成虚函数
	virtual void BuyTickt()
	{
		cout << "买票-打折" << endl;
	}

};

void Func(Person& p)
{
	p.BuyTickt();
}

int main()
{
	Person p;
	Student s;

	Func(p);//传一个Person对象
	Func(s);//传一个Student对象
	return 0;
}

在这里插入图片描述

在这里插入图片描述

下面画一张图来解释一下,为什么加了这两个条件以后就构成多态了:

在这里插入图片描述

在这里插入图片描述

说明:

  • 要实现多态效果,第一必须是基类的指针或引用。因为只有基类的指针或引用才能既指向基类对象又指向派生类对象;
  • 第二派生类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派⽣类之间才能有不同的函数,多态的不同形态效果才能达到。

注意:

  1. 虚函数: 类成员函数前面加virtual修饰,那么这个成员函数被称为虚函数。非成员函数不能加virtual修饰!

代码语言:javascript

AI代码解释

class Person
{
public:
    virtual void BuyTicket() { cout << "买票-全价" << endl;}
};
  1. 虚函数的重写/覆盖:派生类与基类有一个完全相同虚函数,称之为派生类的虚函数重写了基类的虚函数。(完全相同指:返回类型,函数名,参数列表完全相同。)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐