一.多态的含义
多态是面向对象编程的核心之一,其是指不同的对象在使用相同的方法(函数)的时候做出的不同反应。
二.多态的实现思路
多态主要是由继承和虚函数来实现。
1.继承
继承是指一个类从另外的类中以不同的方式去继承成员变量以及成员函数。
继承方式包括 public继承,private继承,protected继承 这三种继承方式。继承的类称为子类或派生类,被继承的是父类或基类。
2.虚函数
先确定基类和子类相同的函数(相同函数名,返回值类型相同,形参表相同),然后在基类的目标函数前面加上 virtual 关键字,之后再在子类的同名函数里面进行修改,在子类的函数后可以加重写关键字(override),也可以不加。这时,子类和父类对于相同的函数就会返回不同的反应。虚函数在父类中写完之后,一旦在子类中检测到同名函数,那么在子类中的重写的函数就会覆盖原来的函数,并且其也是虚函数。
如果虚函数设置了默认参数(缺省值),则基类和派生类中设置的默认值最好保持一致,如果不一致,则以基类中设置的 默认值为准
请注意重载,重写,隐藏三者的区别!
三.多态的简单应用
写一个员工类(父类)与经理类(子类)的实例。
#include<iostream>
using namespace std;
class employee
{
public:
string m_name;
virtual void duty() 虚函数
{
cout << "写代码" << endl;
}
employee(string name) :m_name(name)
{};
};
class manger:public employee
{
public:
void duty() 与父类同名,但是内容不一样。
{
cout << "管理员工" << endl;
}
manger(string name):employee(name)
{}
};
int main()
{
employee a1("王老六");
a1.duty();
manger b1("大老师");
b1.duty();
return 0;
}
四.多态的应用场景以及虚函数工作原理
1.应用场景
多态实际上是指一种需要一个指向子类的基类指针的时候或者是一个基类引用去绑定子类对象时去调用子类的覆盖版本函数的语态,具体过程这里不过多展示。
2.虚函数的实现原理
在编译阶段,当编译器发现父类中有虚函数时,会在父类中创建一个虚函数表,这是一个指针数组,用来存储虚函数的地址。并且该数组放在只读段,还会创建一个虚指针,用来指向虚函数表,当要调用虚函数的时候,先解引用虚值针,找到虚函数表,然后再然后根据函数调用的类型,从虚函数表中获取相应的函数地址,程序跳转到函数地址处执行实际的代码。根据实际调用的对象,会调用不同的虚函数,这就是动态绑定。
五.虚函数回避机制
如果你不想调用子类的重新覆盖的虚函数,只想调用原来的函数,就指定调用的限制作用域,实例如下
#include<iostream>
using namespace std;
class employee
{
public:
string m_name;
virtual void duty()
{
cout << "写代码" << endl;
}
employee(string name) :m_name(name)
{};
};
class manger:public employee
{
public:
void duty()
{
cout << "管理员工" << endl;
}
manger(string name):employee(name)
{}
};
int main()
{
employee a1("王老六");
a1.duty();
manger b1("大老师");
b1.employee::duty(); 显示调用父类的虚函数
return 0;
}