开发中虚函数应用,大大减少开发时间
37 pAddNode -> 37 pAddNode -> isa.isa.node_calc =_addnode_calc;
38 pAddNode -> isa.isa.node_cleanup = _binnode_cleanup;
39 pAddNode -> isa._pLeft = pLeft;
40 pAddNode -> isa._pRight = pRight;
41 }
42 return pAddNode;
43 }
44
45 static double _addnode_calc(Node *pThis)
46 {
47 printf("Adding...\n");
48 AddNode * pAddNode = (AddNode*)pThis;
49 return node_calc(pAddNode -> isa._pLeft) + node_calc(pAddNode -> isa._pRight);
50 }
51
52 static double _multnode_calc(Node *pThis)
53 {
54 printf("Multiplying...\n");
55 MultNode * pMultNode = (MultNode*)pThis;
56 return node_calc(pMultNode -> isa._pLeft)*node_calc(pMultNode -> isa._pRight);
57 }
58
59 static void _binnode_cleanup(Node *pThis)
60 {
61 printf("BinNode cleanup\n");
62 BinNode * pBinNode = (BinNode*)pThis;
63 node_cleanup(pBinNode ->_pLeft);
64 node_cleanup(pBinNode ->_pRight);
65 free(pThis);
66 }
67
68 MultNode * newMultNode(Node *pLeft, Node *pRight)
69 {
70 MultNode *pMultNode = malloc(sizeof(MultNode));
71 if(pMultNode != NULL){
72 pMultNode -> isa.isa.node_calc = _multnode_calc;
73 pMultNode -> isa.isa.node_cleanup = _binnode_cleanup;
74 pMultNode -> isa._pLeft = pLeft;
75 pMultNode -> isa._pRight = pRight;
76 }
77 return pMultNode;
78 }
79
80 void node_cleanup(Node *pThis)
81 {
82 pThis -> node_cleanup(pThis);
83 }
>>> 1.1.3 虚函数
虽然可以使用继承实现表达式算术树,但实现代码中的每个对象都有函数指针。如果结构体内有很多函数指针,或必须生成更多的对象时,将会出现多个对象具有相同的行为、需要较多的函数指针和需要生成较多数量的对象,将会浪费很多的内存。
不妨将Node中的成员转移到另一个结构体中实现一个虚函数表,然后在接口中创建一个抽象数据类型NodeVTable,在此基础上定义一个指向该表的指针vtable。比如:
1 // 接口(CalcTree2.h)
2 typedef struct _NodeVTable NodeVTable;
3 typedef struct _Node{
4 const NodeVTable * vtable;
5 }Node;
6 // 实现(CalcTree2.c)
7 typedef
- 面向对象编程——虚函数(09-20)
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)