二、C++动态联编-类指针(引入虚拟函数)

看来,基于动态联编的机制,使用函数指针就可以编写出相对通用的程序模块。然而,在面向对象的程序设计中,类成为封装功能模块的基本单位。所以不仅需要对函数指针进行动态联编,更需要对类指针进行动态联编。编译器对虚拟函数采用动态联编的方式。

示例代码:

//定义一个基类,名为CDispDecimal。该类封装一个
// 整型数据成员Number、一个虚拟函数virtual DisplayFormat()
#include "stdio.h"     //printf()
#include "stdlib.h"     //atoi()

class CDispDecimal
{
public:
     CDispDecimal(int i)
     {
          Number=i;
     }
     CDispDecimal()
     {
          Number=0;
     }
     virtual DisplayFormat()
     {
          printf("The decimal value is %d\n",Number);
     }
protected:
     int Number;
};
//从基类派生出两个子类,名为 CDispOctal、CDispHexadecimal。
// 这两个类都重载基类的虚拟函数virtual DisplayFormat()
class CDispOctal : public CDispDecimal
{
public:
     CDispOctal(int i)
     {
          Number=i;
     }
     CDispOctal()
     {
          Number=0;
     }
     virtual DisplayFormat()
     {
          printf("The octal value is %o\n",Number);
     }

};
class CDispHexadecimal :public CDispDecimal
{
public:
     CDispHexadecimal(int i)
     {
          Number=i;
     }
     CDispHexadecimal()
     {
          Number=0;
     }
     virtual DisplayFormat()
     {
          printf("The hexadecimal value is %x\n",Number);
     }
};
/*重载虚拟函数要求所有函数声明完全一致,即函数名和形参列表都一致。
否则等同于普通函数的重载,不能实现动态联编。*/


//编写通用函数
void DisplayNumber( CDispDecimal* DisplayFormat)
{
     //调用以实参传入对象指针的虚拟函数,一某种格式输出整形数字
     DisplayFormat->DisplayFormat();
}
/*C++编译器可以直接将派生类的指针转换为基类指针。虚拟函数采用动态联编,
函数体内调用的DisplayFormat()将由实参决定。*/


//定义主函数
int main(int argc, char* argv[])
{
     CDispDecimal Deci;
     CDispOctal Octa;
     CDispHexadecimal Hexa;
     //如果有数字形式的命令行参数行,将其输出,否则输出0
     if(argc>1)
     {
          /*因为这3各类都定义了int型的转换构造函数,即以int为参数的构造函数,
          所以下面可以直接赋值,而无需重载“=”运算符*/
          Deci=atoi(argv[1]);
          Octa=atoi(argv[1]);
          Hexa=atoi(argv[1]);
     }

     //分别以3种格式将数字输出
     DisplayNumber(&Deci);
     DisplayNumber(&Octa);
     DisplayNumber(&Hexa);


     return 0;
}

输出结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值