静态多态
&emap;&emap;在前面学习重载的时候,在调用函数时,编译器会根据指定的参数去调用对应的函数,这是一种静态的多态的表现方式。在面向类中同样也有多态的定义。
动态多态
动态多态是在调用的时候自动去匹配和描述物体的信息。实现动态多态的条件有:
- 在类内部的函数
- 存在继承和派生的关系
- 基类类型描述派生类的实例对象
下面这个例子,就是没有起到多态时,从而产生了一些使用上的歧义的现象。
#include<stdio.h>
#include<iostream>
class Animal
{
public:
void show_info()
{
printf("I am Animal \n");
}
};
class Dog :public Animal
{
public:
void show_info()
{
printf("I am Dog \n");
}
};
int main()
{
Dog WangCai;
WangCai.show_info();
Animal & A = WangCai;
A.show_info();
system("pause");
return 0;
}
上面的代码中可以看到,有一个动物类,派生除了一个狗类,在main函数中,创建了一个狗对象,并且使用了一个Animal类型的引用来引用这个创建出来的对象,最终,可以看到输出的结果,引用和狗对象的输出的结果不同。但是按照理解,使用引用,应该输出的是原来数据的内部也就是I am Dog
;
在类中对子类和父类中都含有的变量进行重写是,使用虚函数,能够实现多态。
#include<stdio.h>
#include<iostream>
class Animal
{
public:
virtual void show_info()
{
printf("I am Animal \n");
}
};
class Dog :public Animal
{
public:
virtual void show_info()
{
printf("I am Dog \n");
}
};
int main()
{
Dog WangCai;
WangCai.show_info();
Animal & A = WangCai;
A.show_info();
system("pause");
return 0;
}
虚函数在类中的存在方式
虚函数表在类中存在,并且可以被继承,若在子类中对父类继承而来的虚函数进行了重写,那么在将会打断子类中原来虚函数的连接并且重新连接到重写的虚函数上。这就是实现动态多态的原因。