虚函数有个十分重要的作用,之动态绑定

将基类指针指向派生类,可调用派生类声明的虚函数;所以在事件运行中可根据动态传递过来的形参,完成虚函数的动态绑定!


如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数;如果调用虚函数,则直到运行时才能确定到底调用哪个函数,运行的虚函数是 引用所绑定的 或 指针所指向的 所属类型定义的 版本


这也是C++多态性的体现!


#include "stdio.h"
#include <Winsock2.h>
#pragma comment(lib, "WS2_32")


char str[20]={0};
class pubclass
{
public:
virtual void pubout();
void fun()
{
printf("base xu\n");
}
};


void pubclass::pubout()
{
printf("form pubclass pubout\n");
}


class testclass:public pubclass
{
public:
int pub_datain;
int pub_dataout;
//protected:
//private:
void appendin(int in,int out);
void pubout();
void fun()
{
printf("child xu\n");
}
};


void testclass::appendin(int in,int out)
{
printf("in is %hu\n",in);
printf("out is %d\n",out);
}


void testclass::pubout()
{
printf("form testclass pubout\n");
}


#define test(page, category, property) \
if (int prop = property) \
{ \
page->appendin(category, prop); \
}


void main()
{
int i=1;
testclass *ctest; //派生类
testclass cctest;
pubclass pclass; //基类
pubclass *ppclass; //基类指针

test(ctest,51,2);
if (int prop = 0) 

printf("ok\n");
}else{
printf("error\n");
}


i=gethostname(str, 20);
printf("%d\n",i);//=-1,返回错误
//printf("%s\n",*(&str[0]));

printf("ppclass指向基类;\n");
ppclass=&pclass; //基类
ppclass->pubout(); //指向虚函数
ppclass->fun(); //非虚函数,始终调用基类函数
printf("ppclass指向派生类;\n");
ppclass=&cctest; //派生类
ppclass->pubout(); //指向虚函数,调用派生类的函数
ppclass->pubclass::pubout();//覆盖虚函数机制,调用了基类的函数
ppclass->fun(); //非虚函数


getchar();
}

运行后结果如下:



从图中卡可以看出虚函数、非虚函数,虚函数覆盖机制的结果!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值