二、C++动态联编-类指针(引入虚拟函数)
2013-12-06 10:57
302 查看
看来,基于动态联编的机制,使用函数指针就可以编写出相对通用的程序模块。然而,在面向对象的程序设计中,类成为封装功能模块的基本单位。所以不仅需要对函数指针进行动态联编,更需要对类指针进行动态联编。编译器对虚拟函数采用动态联编的方式。
示例代码:
//定义一个基类,名为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;
}
输出结果:
示例代码:
//定义一个基类,名为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++动态联编-函数指针
- C++动态联编的好处,为什么要用基类的指针指向派生类的方式来实现重写
- 成员函数指针与高效C++委托 (delegate)
- 深入理解c++指针的指针和指针的引用
- C++ 野指针,内存泄漏
- C/C++数组名与指针区别深入探索
- Java的引用和C++的指针有什么区别?
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++智能指针之auto_ptr
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- c++中的引用与指针的区别
- 深入理解C/C++数组和指针
- C++引用和指针
- C++文本查询程序 定义类管理数据 用智能指针 用StrBlob代替vector<string> C++Primer 练习12.32
- C++中类成员对象与指针的区别
- c/c++指针概念
- C++中指针乱了!如何解决
- 5 C++ Boost 智能指针