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

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

示例代码:

//定义一个基类,名为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;
}

输出结果:

相关文章推荐

C++动态联编-函数指针

在C++编译时,对于常规的函数调用,编译器在函数的调用出插入函数的相对地址,程序运行时可以有函数的相对地址计算出函数的绝对地址,这样函数可以被正确调用。这种在编译时就确定函数地址的联编过程叫做静态联编...

C++动态联编的好处,为什么要用基类的指针指向派生类的方式来实现重写

为什么要用指针或引用, 为什么要用基类指向派生类, 动态联编的好处。

07_类类型转换、继承、虚基类、 静态联编 与 动态联编、父子类指针、虚函数、类模板

目录 一类类型转换 include include include include include include include include include include include ...

C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟

一、对象数组的定义和初始化 1. 对象数组的创建方法:   //常量都是无名对象 1)类类型 数组名[元素个数]; 2)类类型 数组名[元素个数] = { 数组的初始化列表... }; 2. ...

Windbg技巧: 利用C++类对象的虚拟函数表指针在内存中搜索对象

Windbg是Windows系统下的调试利器,但即便有了windbg,也有力不从心的时候。我最近对release版本的驱动程序调试得较多,最大的困扰是虽然有私有符号,但在切换堆栈帧的时候,大多数情况下...

C++调用空指针对象的成员函数——静态绑定与动态绑定

最近代码中看到调用空指针对象的成员函数的写法,联想起上次碰到的问题:C++类的成员函数存储方式(是否属于类的对象)两者的本质是一样的,上次只是简单地讨论了下,这次从编译器的角度,来谈一谈这个知识点。一...

C/C++高阶语法:函数指针及其应用,动态链接库,正向调用

1、在介绍正向调用之前,先讲一讲动态链接库的知识:       1)、 动态链接库 DLL,即Dynamic Link Library,在理解动态链接库的时候,我们可以把它理解为一个包含变量,函数或...

详细介绍C++中的虚函数和动态联编

面向对象程序设计的基本观点是用程式来仿真大千世界,这使得它的各种根本特性非常人性化,如封装、继承、多态等等,而虚函数就是c++中实现多态性的主将。为了实现多态性,c++编译器也革命性地提供了动态联编(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二、C++动态联编-类指针(引入虚拟函数)
举报原因:
原因补充:

(最多只允许输入30个字)