用C编写一个模拟实现C++多态应用的一个范例
2011-07-19 16:16
567 查看
C++的知识,虽然不直接使用C++编程,但必须理解C++的多态概念,知道多态的应用是怎么一回事,在此基础上,知其然并且知其所以然,要能够理解C++的多态是如何实现的
// 几个基本的函数,对应抽象类中的虚函数
//
void foo1()
{
printf( "anything foo1 \r\n" );
}
void foo2( int i )
{
}
void foo3( int i, int j )
{
}
// 虚表,包含了虚函数的指针
typedef struct Vtbl
{
void (*pf1)();
void (*pf2)( int );
void (*pf3)( int, int );
}Vtbl;
// 类的虚表
Vtbl g_vtbl = { &foo1, &foo2, &foo3, };
// 基类,开始处是虚表指针,
// 后面是结构成员。
typedef struct Anything
{
//Vtbl *pvtbl;
void *pvtbl;
int field1;
int field2;
}Anything;
// 构造函数
// 也是一个普通的成员函数,需要一个this指针
void InitAnything( Anything *p )
{
p->pvtbl = &g_vtbl;
p->field1 = 0x1234;
p->field2 = 0x5678;
}
// 子类中的虚函数,重载了父类中的同类型函数
void Sfoo1()
{
// 可以考虑调用父类中的函数
// foo1();
printf( "something foo1 \r\n" );
}
void Sfoo4( char *s )
{
printf( "hello %s\r\n", s );
}
// 子类中的虚表,因为内存布局是一样的,
// 直接使用父类的
typedef struct SVtbl
{
Vtbl vtbl;
void (*pf4)( char * );
}SVtbl;
// 子类的虚表
SVtbl g_svtbl = { { &Sfoo1, &foo2, &foo3, }, &Sfoo4, };
// 某个子类,包含父类的内容
// 还有自己的成员
typedef struct Something
{
Anything a;
int field3;
}Something;
// 构造函数
// 也是一个普通的成员函数,需要一个this指针
void InitSomething( Something *p )
{
InitAnything( (Anything*)p );
p->a.pvtbl = &g_svtbl;
p->field3 = 0xabcd;
}
void TestPolymorphism( Anything *p )
{
// 虽然使用的是父类型的指针
// 但虚函数最终会根据对象的真实类型调用。
(*((Vtbl*)p->pvtbl)->pf1)();
}
void TestVtbl()
{
// 子类的一个对象
Something s;
Anything *p = 0;
// 初始化
InitSomething( &s );
p = (Anything*)&s;
// 调用Sfoo4
((SVtbl*)p->pvtbl)->pf4( "Sfoo4" );
// 测试多态
TestPolymorphism( (Anything*)&s );
}
// 几个基本的函数,对应抽象类中的虚函数
//
void foo1()
{
printf( "anything foo1 \r\n" );
}
void foo2( int i )
{
}
void foo3( int i, int j )
{
}
// 虚表,包含了虚函数的指针
typedef struct Vtbl
{
void (*pf1)();
void (*pf2)( int );
void (*pf3)( int, int );
}Vtbl;
// 类的虚表
Vtbl g_vtbl = { &foo1, &foo2, &foo3, };
// 基类,开始处是虚表指针,
// 后面是结构成员。
typedef struct Anything
{
//Vtbl *pvtbl;
void *pvtbl;
int field1;
int field2;
}Anything;
// 构造函数
// 也是一个普通的成员函数,需要一个this指针
void InitAnything( Anything *p )
{
p->pvtbl = &g_vtbl;
p->field1 = 0x1234;
p->field2 = 0x5678;
}
// 子类中的虚函数,重载了父类中的同类型函数
void Sfoo1()
{
// 可以考虑调用父类中的函数
// foo1();
printf( "something foo1 \r\n" );
}
void Sfoo4( char *s )
{
printf( "hello %s\r\n", s );
}
// 子类中的虚表,因为内存布局是一样的,
// 直接使用父类的
typedef struct SVtbl
{
Vtbl vtbl;
void (*pf4)( char * );
}SVtbl;
// 子类的虚表
SVtbl g_svtbl = { { &Sfoo1, &foo2, &foo3, }, &Sfoo4, };
// 某个子类,包含父类的内容
// 还有自己的成员
typedef struct Something
{
Anything a;
int field3;
}Something;
// 构造函数
// 也是一个普通的成员函数,需要一个this指针
void InitSomething( Something *p )
{
InitAnything( (Anything*)p );
p->a.pvtbl = &g_svtbl;
p->field3 = 0xabcd;
}
void TestPolymorphism( Anything *p )
{
// 虽然使用的是父类型的指针
// 但虚函数最终会根据对象的真实类型调用。
(*((Vtbl*)p->pvtbl)->pf1)();
}
void TestVtbl()
{
// 子类的一个对象
Something s;
Anything *p = 0;
// 初始化
InitSomething( &s );
p = (Anything*)&s;
// 调用Sfoo4
((SVtbl*)p->pvtbl)->pf4( "Sfoo4" );
// 测试多态
TestPolymorphism( (Anything*)&s );
}
相关文章推荐
- c语言模拟实现c++的继承和多态
- php接口技术实现一个简单的多态应用实例
- C++面向对象之多态的实现和应用详解
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- C#--第2周实验--任务11--编写一个控制台应用--1列数规则如下:1,1,2,3,5,8,13,21,34...求第30位数是多少?(用递归算法实现)
- 编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。
- 两个栈模拟一个队列和两个队列模拟一个栈(c++实现)
- 如何实现用Java编写程序,设计一个模拟电梯运行的类
- 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
- 模拟实现一个简单的中英互译字典——二叉搜索树的应用KV模型
- 模拟继承和多态--C语言模式实现C++继承和多态
- 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
- 从易到难编写C++程序,(3)问题:实现一个复杂的猜数字游戏
- c语言模拟实现c++的继承多态
- C语言如何模拟C++实现继承和多态
- c语言模拟实现c++继承和多态
- c++实现两个堆栈模拟一个队列
- 用C++编写函数判别一个数是否是质数,在主程序中实现输入输出
- C语言模拟实现C++的多态
- C语言模拟实现C++的继承与多态示例