汉扬编程 C语言入门 C语言模拟面向对象技术:如何利用函数指针的继承来实现多态?

C语言模拟面向对象技术:如何利用函数指针的继承来实现多态?

假如想在C中使用面向对象技术,应该怎样做?最重要的是要找到虚函数的替代技术。可以在struct中添加一个“类型域”来指明对象是基类还是某个派生类:

#include <stdio.h>struct Shape1{ enum Kind{circle, rectangle}kind;};void draw(struct Shape1* p) // 仿虚函数{ switch(p->kind){ case Shape1::circle: printf("draw a circle!\\n"); break; case Shape1::rectangle: printf("draw a rectangle!\\n"); break; }}void f(struct Shape1* pp){ draw(pp);}int main(){ struct Shape1 rec; rec.kind = Shape1::rectangle; f(&rec); while(1); return 0;}以上代码可以正常工作,但当加入一个新的形状,必须修改伪虚函数draw(),为switch语句增加一个case分支。这意味着不可能将“伪虚函数”放在库中,因为用户不得不频繁修改这些函数。虚函数最有效的替代技术之一是函数指针:

//C语言模拟实现继承和多态#include <stdio.h>typedef void (*FUNC)(); //使用函数指针来模拟实现struct B //父类{ FUNC _func; int _a;};struct D //子类{ B _ca; int _b;};void B_Func() //父类的成员函数{ printf("B:_func()\\n");}void D_Func() //子类的成员函数{ printf("D:_func()\\n");}// 父类的指针可以指向父类或者子类的对象void func(B *ptr) // 公有的接口{ ptr->_func();}void TestC(){ B b; D d; // 对父类和子类的成员函数进行初始化 b._func=B_Func; d._ca._func=D_Func; // 父类的对象调用父类的成员函数 b._func(); // B:_func() // 子类的对象要调用自己的成员函数,需要先找到自己继承过来的父类的函数指针 // 再调用父类的成员函数 d._ca._func(); // D:_func() B *ptr=&b; // 一个父类的指针指向父类的对象 ptr->_func(); // B:_func() ptr=(B *)&d; // 父类的指针也可以指向子类的对象,在C语言中需要强制类型转换 ptr->_func(); // D:_func() func(&b); // B:_func() func((B *)&d); // D:_func()}int main(){ TestC(); while(1); return 0;}/*B:_func()D:_func()B:_func()D:_func()B:_func()D:_func()*/模仿虚函数表:

#include <iostream>using namespace std;typedef void (*EatPtr)();typedef void (*PlayPtr)();typedef struct _virtualPtrTable{ EatPtr eat; PlayPtr play;}VPtrTable;typedef struct _base{ VPtrTable vptrTable; int age;}Base;typedef struct _deriveA{ Base base; int age;}DeriveA;typedef struct _deriveB{ Base base; int age;}DeriveB;/** 基类的实现函数 **/void baseEat(){ cout<<"基类在吃饭….."<<endl;}void basePlay(){ cout<<"基类在玩耍….."<<endl;}/** 派生类A的实现函数 **/void aEat(){ cout<<"子类A在吃饭….."<<endl;}void aPlay(){ basePlay();}/** 派生类B的实现函数 **/void bEat(){ cout<<"子类B在吃饭….."<<endl;}void bPlay(){ basePlay();}int main(int argc, char *argv[]){ Base *base; DeriveA deriveA; deriveA.base.vptrTable.eat = aEat; deriveA.base.vptrTable.play = aPlay; deriveA.base.age = 40; deriveA.age = 20; DeriveB deriveB; deriveB.base.vptrTable.eat = bEat; deriveB.base.vptrTable.play = bPlay; deriveB.base.age = 40; deriveB.age = 21; base = (Base *)&deriveA; base->vptrTable.eat(); base->vptrTable.play(); cout<<"age:"<<base->age<<endl; cout<<"———————————————\\n"; base = (Base *)&deriveB; base->vptrTable.eat(); base->vptrTable.play(); cout<<"age:"<<base->age<<endl; while(1); return 0;}/*子类A在吃饭…..基类在玩耍…..age:40———————————————子类B在吃饭…..基类在玩耍…..age:40*/-End-

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/6581.html

信息学奥赛编程语言C++语法(2)——注释及语句(块)

strcat在C语言中有什么用意呢?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部