C++静态多态和动态多态

静态多态和动态多态


静态多态

  • 静态多态也称为编译时多态,即在编译时决定调用哪个方法;
  • 静态多态一般是指方法重戟;
  • 只要构成了方法重载,就可以认为形成了静态多态的条件;
  • 静态多态与是否发生继承没有必然联系

如下所示:

void test(int a){ cout << "1" << endl; }
void test(int a,int y){ cout << "2" << endl; }
void test(int a,int y,int z){ cout << "2" << endl; }
int main()
{
    test(1);
    test(1, 2);
    test(1, 2, 3);

虽然调用的三个函数名字相同,但是在编译的时候已经直到调用的是哪一个函数。

编译前已经知道了对同一函数的不同响应。


动态多态

  • 动态多态也称为运行时多态,即在运行时才能确定调用哪个方法;
  • 形成动态多态必须具体以下条件:继承是实现动态多态的首要前提
  • 在继承中必须要有方法覆盖;
  • 必须由基类的引用指向派生类的实例,并且通过基类的引用调用被覆盖的方法。

这个地方引用的是我另一篇博客的代码。

即将animal作为基类,然后产生三个派生类cat类,dog类,pig类,并定义出一个animal数组,数组的每个位置都是基类和派生类之间转化而来的。

此时在编译的时候,数组的三个位置都调用show函数时,不能里面分辨出是哪个类对象的show函数,之后在运行时才知道,这种就叫做动态多态。

#include
using namespace std;

class animal
{
public:
	virtual void show()
	{
		cout << "我是animal类" << endl;
	}
};

class dog :public animal
{
public:
	void show()
	{
		cout << "我是dog类" << endl;
	}
};

class cat :public animal
{
public:
	void show()
	{
		cout << "我是cat类" << endl;
	}
};

class pig :public animal
{
public:
	void show()
	{
		cout << "我是pig类" << endl;
	}
};

int main()
{
	cat a; dog b; pig c;
	animal *x[3] = { &a, &b, &c };
	
	for (int i = 0; i < 3; i++)
	{
		x[i]->show();
	}
	system("pause");
	return 0;
}

比较

静态多态

优点:

  1. 由于静多态是在编译期完成的,因此效率较高,编译器也可以进行优化;
  2. 有很强的适配性和松耦合性,比如可以通过偏特化、全特化来处理特殊类型;
  3. 最重要一点是静态多态通过模板编程为C++带来了泛型设计的概念,比如强大的STL库。

缺点:

  1. 由于是模板来实现静态多态,因此模板的不足也就是静多态的劣势,比如调试困难、编译耗时、代码膨胀、编译器支持的兼容性
  2. 不能够处理异质对象集合

动态多态

优点:

  1. OO设计,对是客观世界的直觉认识;
  2. 实现与接口分离,可复用
  3. 处理同一继承体系下异质对象集合的强大威力

缺点:

  1. 运行期绑定,导致一定程度的运行时开销;
  2. 编译器无法对虚函数进行优化
  3. 笨重的类继承体系,对接口的修改影响整个类层次;

不同点:

  1. 本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;
  2. 动态多态中接口是显式的,以函数签名为中心,多态通过虚函数在运行期实现,静态多台中接口是隐式的,以有效表达式为中心,多态通过模板具现在编译期完成

相同点:

  1. 都能够实现多态性,静态多态/编译期多态、动态多态/运行期多态;
  2. 都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口,继承类负责实现;

你可能感兴趣的:(C++学习,c++,多态)