c++通过虚函数实现多态."无论发送消息的对象属于什么类,它们均发送具有同一形式的消息,对消息的处理方式可能随接手消息的对象而变"的处理方式被称为多态性。而虚函数是通过virtual关键字来限定的。
虚函数是动态多态性的基础,其调用的方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用基类的还是子类的,系统会根据基类指针所指向的对象来决定要调用的函数);非虚函数与其相反,是静态联编(调用已经在编译时期就决定了;在编译时期,系统已经根据指针所属的类型确定了要调用的函数)。
下面通过Linux c++虚函数(virtual function)简单用法示例代码来演示具体用法,通过ModuleBase基类指针来调用其子类ModuleA和GeneralModule的实例对象方法。
具体代码如下:
#include "stdio.h"
#include "unistd.h"
class ModuleBase
{
public:
int module_id;
int un_path;
virtual int send(unsigned char *packet,int *plen,void *arg)
{};
};
class ModuleA: public ModuleBase
{
public:
ModuleA(){period=3600;};
~ModuleA(){};
int period;
unsigned last;
unsigned current;
bool pre_check()
{
printf("period:%drn",period);
return true;
};
int send(unsigned char *packet,int *plen,void *arg)
{
if(pre_check())
{
printf("ModuleA send!rn");
}
};
};
class GeneralModule: public ModuleBase
{
public:
int send(unsigned char *packet,int *plen,void *arg)
{
printf("GeneralModule send!rn");
};
};
//g++ -o test_virtual test_virtual.cpp
int main(int argc,char *argv[])
{
ModuleBase *pa=new ModuleA();
ModuleBase *pg=new GeneralModule();
while(true)
{
pa->send(NULL,NULL,NULL);
pg->send(NULL,NULL,NULL);
sleep(1);
}
return 1;
}
输出结果:
period:3600
ModuleA send!
GeneralModule send!
period:3600
ModuleA send!
GeneralModule send!
period:3600
ModuleA send!
GeneralModule send!
period:3600
ModuleA send!
GeneralModule send!
period:3600
ModuleA send!
GeneralModule send!
period:3600
ModuleA send!
GeneralModule send!
以上代码在Centos 5.4系统下编译测试通过。