多态:通过基类指针访问派生类成员。C++语言的多态性分编译时多态和运行时多态 ,编译时多态可以通过函数重载实现,具体表现在根据参数的个数和类型不同选择合适的同名函数 ,模板属于编译时多态性,因为编译时自动根据模板生成模板函数。 运行时多态通过虚函数(https://blog.csdn.net/yqning123/article/details/82873069)实现,就是运行时根据对象类型自动选择正确的调用接口。运行时多态是根据对象类型自动选择正确的调用函数,也叫动态绑定。
1、构成多态的条件
1)必须存在继承关系
2)继承中,必须有同名的虚函数,并且他们是覆盖关系,而不是重载关系
(多态,重载,覆盖区别与联系https://blog.csdn.net/yqning123/article/details/82872975)
3)存在基类指针,通过基类指针调用子类同名函数
#include <iostream>
using namespace std;
class Human
{
char *name;
int age;
public:
virtual void get_info(){ //方法2:使用虚函数,这样子类实现多态,可以调用父类的方法,也能调用子类的方法
cout << "Human Info:" << endl;
}
};
class SoftHuman:public Human
{
char *language;
public:
void get_info(){
cout << "SoftHuman Info:" << endl;
}
};
int main(int argc, char const *argv[])
{
SoftHuman sh;
sh.get_info(); //调用子类方法
sh.Human::get_info(); //调用父类方法
cout << "===========================" << endl;
Human *h = new SoftHuman; //父类new子类,因为子类包含父类的东西,是父类的一个扩展
h->get_info(); //用的是父类的方法
//如何调用子类的方法?
((SoftHuman *)h)->get_info(); //方法1:强制转换
//方法2:见Human的get_info()
((Human *)h)->get_info(); //父类使用虚函数之后,即使强制父类指针也没法调用父类方法
h->Human::get_info(); //这个时候,想要调用父类函数,只能使用作用域的方法
cout << "===========================" << endl;
/*
SoftHuman *s = new Human; //子类new父类是不可以的,
s->get_info();
*/
SoftHuman *s = new SoftHuman; //但是子类new完之后,可以强转成Human*
((Human *)s)->get_info(); //这里就是子类调用父类的方法
return 0;
}