到底什么是多态?

“多态性”(polymorphism)一词意味着具有多种形式。 简单来说,我们可以将多态性定义为消息以多种形式展示的能力。
多态性的一个真实例子是一个人可以同时具有不同的特征。 男人同时是父亲、丈夫和雇员。 所以同一个人在不同的情况下会表现出不同的行为。 这称为多态性。 多态性被认为是面向对象编程的重要特征之一。

多态性的类型

  • 编译时的多态性
  • 运行时的多态性

1.编译时多态性

这种类型的多态性是通过函数重载或运算符重载来实现的。

A. 函数重载

当有多个同名但参数不同的函数时,这些函数被称为 重载, 因此这被称为函数重载。 来重载函数 可以通过更改参数数量 或/和 更改参数类型 。 简单来说,它是面向对象编程的一个特点,当许多任务列在一个函数名称下时,它提供许多具有相同名称但不同参数的函数。 某些 函数重载规则,重载函数时应遵循

下面是显示函数重载或编译时多态性的 C++ 程序:

// C++ program to demonstrate
// function overloading or
// Compile-time Polymorphism
#include <bits/stdc++.h>

using namespace std;
class Geeks {
public:

	// Function with 1 int parameter
	void func(int x)
	{
		cout << "value of x is " <<
				x << endl;
	}

	// Function with same name but
	// 1 double parameter
	void func(double x)
	{
		cout << "value of x is " <<
				x << endl;
	}

	// Function with same name and
	// 2 int parameters
	void func(int x, int y)
	{
		cout << "value of x and y is " <<
				x << ", " << y << endl;
	}
};

// Driver code
int main()
{
	Geeks obj1;

	// Function being called depends
	// on the parameters passed
	// func() is called with int value
	obj1.func(7);

	// func() is called with double value
	obj1.func(9.132);

	// func() is called with 2 int values
	obj1.func(85, 64);
	return 0;
}

输出

value of x is 7
value of x is 9.132
value of x and y is 85, 64

解释: 在上面的例子中,一个名为 function func() 的函数在三种不同的情况下表现不同,这是多态性的一个特性。

B. 运算符重载

C++ 能够为运算符提供对数据类型的特殊含义,这种能力称为运算符重载。 例如,我们可以使用字符串类的加法运算符 (+) 来连接两个字符串。 我们知道这个运算符的任务是将两个操作数相加。 因此,单个运算符“+”,当放在整数操作数之间时,将它们相加,当放在字符串操作数之间时,将它们连接起来。

下面是演示运算符重载的 C++ 程序:

// C++ program to demonstrate
// Operator Overloading or
// Compile-Time Polymorphism
#include <iostream>
using namespace std;

class Complex {
private:
	int real, imag;

public:
	Complex(int r = 0,
			int i = 0)
	{
		real = r;
		imag = i;
	}

	// This is automatically called
	// when '+' is used with between
	// two Complex objects
	Complex operator+(Complex const& obj)
	{
		Complex res;
		res.real = real + obj.real;
		res.imag = imag + obj.imag;
		return res;
	}
	void print()
	{
	cout << real << " + i" <<
			imag << endl;
	}
};

// Driver code
int main()
{
	Complex c1(10, 5), c2(2, 4);

	// An example call to "operator+"
	Complex c3 = c1 + c2;
	c3.print();
}

输出

12 + i9 

解释: 在上面的例子中,运算符'+'被重载了。 通常,此运算符用于将两个数(整数或浮点数)相加,但此处使该运算符执行两个虚数或复数的相加。

2. 运行时多态性

这种类型的多态性是通过 Function Overriding 实现的。 后期绑定和动态多态是运行时多态的其他名称。 函数调用在运行时 多态性 中在运行时解析。 相反,对于编译时多态性,编译器在运行时推导后确定将哪个函数调用绑定到对象。

A. 函数覆盖

当派生类具有基类的成员函数之一的定义时,就会发生函数覆盖。 据说该基本功能已被覆盖。

下面是演示函数覆盖的 C++ 程序:

// C++ program for function overriding
#include <bits/stdc++.h>
using namespace std;

class base {
public:
	virtual void print()
	{
		cout << "print base class" <<
				endl;
	}

	void show()
	{
	cout << "show base class" <<
			endl;
	}
};

class derived : public base {
public:

	// print () is already virtual function in
	// derived class, we could also declared as
	// virtual void print () explicitly
	void print()	
	{
		cout << "print derived class" <<
				endl;
	}

	void show()
	{
	cout << "show derived class" <<
			endl;
	}
};

// Driver code
int main()
{
	base* bptr;
	derived d;
	bptr = &d;

	// 虚函数绑定在
	// 运行时 (Runtime polymorphism)
	bptr->print();

	// 非虚函数绑定在
	// 编译时
	bptr->show();

	return 0;
}

输出

print derived class
show base class

虚函数

一个虚函数是 在基类中使用关键字virtual声明并在派生类中重新定义(Overridden)的成员函数。
关于虚函数的一些要点:

*虚函数本质上是动态的。
*插入关键字“ virtual ”来定义的,并且总是用基类声明并在子类中被覆盖 它们是通过在基类中
*在运行时调用虚函数 

下面是演示虚函数的C++程序:

// C++ Program to demonstrate
// the Virtual Function
#include <iostream>
using namespace std;

// Declaring a Base class
class GFG_Base {

public:
	// virtual function
	virtual void display()
	{
		cout << "Called virtual Base Class function" <<
				"\n\n";
	}

	void print()
	{
		cout << "Called GFG_Base print function" <<
				"\n\n";
	}
};

// Declaring a Child Class
class GFG_Child : public GFG_Base {

public:
	void display()
	{
		cout << "Called GFG_Child Display Function" <<
				"\n\n";
	}

	void print()
	{
		cout << "Called GFG_Child print Function" <<
				"\n\n";
	}
};

// Driver code
int main()
{
	// Create a reference of class GFG_Base
	GFG_Base* base;

	GFG_Child child;

	base = &child;

	// This will call the virtual function
	base->GFG_Base::display();

	// this will call the non-virtual function
	base->print();
}

输出

Called virtual Base Class function

Called GFG_Base print function
posted @ 2023-02-23 17:21  朱英浩  阅读(299)  评论(0编辑  收藏  举报