3.多态及其实现方法-灵析社区

菜鸟码转

1.多态的概念:

多态就是不同继承类的对象,对同一消息做出不同的响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现方式。在基类的函数前加上 virtual 关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

程序示例如下:

#include <iostream>
using namespace std;

class Base
{
public:
	virtual void fun() { cout << "Base::fun()" << endl; }

	virtual void fun1() { cout << "Base::fun1()" << endl; }

	virtual void fun2() { cout << "Base::fun2()" << endl; }
};
class Derive : public Base
{
public:
	void fun() { cout << "Derive::fun()" << endl; }

	virtual void D_fun1() { cout << "Derive::D_fun1()" << endl; }

	virtual void D_fun2() { cout << "Derive::D_fun2()" << endl; }
};
int main()
{
	Base *p = new Derive();
	p->fun(); // Derive::fun() 调用派生类中的虚函数
	return 0;
}

2.多态的实现原理:

多态是通过虚函数实现的,虚函数的地址保存在虚函数表中,虚函数表的地址保存在含有虚函数的类的实例对象的内存空间中。

  • 在类中用 virtual 关键字声明的函数叫做虚函数;
  • 存在虚函数的类都有一个虚函数表,当创建一个该类的对象时,该对象有一个指向虚函数表的虚表指针(虚函数表和类对应的,虚表指针是和对象对应);
  • 当基类指针指向派生类对象,基类指针调用虚函数时,该基类指针指的虚表指针实际指向派生类虚函数表,通过遍历虚表,寻找相应的虚函数然后调用执行。

基类的虚函数表如下图所示:

简单解释:当基类的指针指向派生类的对象时,通过派生类的对象的虚表指针找到虚函数表(派生类的对象虚函数表),进而找到相应的虚函数 Derive::f() 进行调用。

3.多态的总结:

根据上述的结论,我们可以知道虚函数的调用是在运行时决定,是由本身所指向的对象所决定的。

  • 如果使用虚函数,基类指针指向派生类对象并调用对象方法时,使用的是子类的方法;
  • 如果未使用虚函数,则是普通的隐藏,则基类指针指向派生类对象时,使用的是基类的方法(与指针类型看齐)
  • 基类指针能指向派生类对象,但是派生类指针不能指向基类对象

阅读量:2012

点赞量:0

收藏量:0