新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。
10年积累的网站建设、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有彭山免费网站建设让你可以放心的选择与我们合作。
举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加virtual也是虚函数。
最简单的做法是在结构体里存函数指针,然后初始化结构体的时候将函数的地址赋值给它。
复杂一点的,就得按照C++的多态原理,用虚函数表(其实就是能记录函数名对应的函数地址就好)记录每种结构体的成员函数地址,然后每个结构体里多存一个虚函数表的地址。。。然后调用函数的时候查到函数地址强转成函数类型然后调用。。。这个可以自己研究一下c++的虚函数表机制。
以下小程序说明了多态性
#include "stdafx.h"
#includeiostream
using namespace std;
class Base
{
public:
virtual void vf() //只有虚函数、纯虚函数才有多态性
{
cout "调用了基类函数 vf() 。" endl;
}
};
class A : public Base
{
public:
void vf()
{
cout "调用了子类 A 函数 vf() 。" endl;
}
};
class B : public Base
{
public:
void vf()
{
cout "调用了子类 B 函数 vf() 。" endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Base *p, bs;
A a;
B b;
p = bs; //基类指针指向基类对象
p-vf(); //调用的是基类函数 vf()
p = static_castBase*(a);//基类指针指向类 A 对象
p-vf();//调用的是类 A 函数 vf()
p = static_castBase*(b);//基类指针指向类 B 对象
p-vf();//调用的是类 B 函数 vf()
//这就是多态性
system("pause");
return 0;
}
运行结果: