C语言模式实现C++继承和多态

来源:互联网 发布:网络社会工作局局长 编辑:程序博客网 时间:2024/05/16 18:51

C语言模式实现C++继承和多态

描述:

C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A。并且能达

到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数。


C++中的继承、多态

继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质

不同的东西。

继承是一种复用手段,在继承关系里基类的成员类的成员派生类的成员,由此达到复用的目的。

 

所谓多态,其实就是“多种形态”。

C++中虚函数的主要作用就是实现多态。简单说父类的指针/引用调用重写的虚函数,当父类指针/引用指向父类对象

时调用的是父类的虚函数,指向子类对象时调用的是子类的虚函数。


#include <iostream>#include <assert.h>#include <Windows.h>using namespace std;//C++中的多态class AA{public:virtual void fun1(){cout << "AA::fun1()" << endl;}virtual void fun2(){cout << "AA::fun2()" << endl;}private:int _aa;};class BB :public AA   //公有继承{public:virtual void fun1()     //子类重写父类的虚函数时,子类的virtual可以不写{cout << "BB::fun1()" << endl;}virtual void fun2(){cout << "BB::fun2()" << endl;}private:int _bb;};

#include "源.h"void Test(){AA tty;BB vvz;AA* p = &tty;   //父类指针指向父类引用p->fun1();      //父类指针指向父类对象p->fun2();p = &vvz;      //父类指针指向子类引用,多态体现p->fun1();     //父类指针指向子类对象p->fun2();}int main(){Test();system("pause");return 0;}




而用C语言又怎样实现C++的继承和多态呢?


C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的。

C++在语言级别添加了很多新的机制(封装、继承、多态...)。而在C语言中,我们也可以使用这样的机制,前提是我们需要自己实现。

基本思想:

1.结构体

在C语言中,我们常常把一个对象用结构体进行封装,这样便于对对象进行操作,例:

struct AA{int a;char b;}xxy;
结构体可以嵌套,因而可以把一个结构体当成另一个结构体的成员,例:

struct AA{int a;char b;}xxy;struct BB{int c;double q;struct AA tty;}zzo;

2.函数指针

顾名思义,函数指针就是指向函数的指针,它是一个指针,指向函数的首地址,函数名即为该函数的首地址。

//Fun函数为一个返回值为char* 的函数char* Fun(char* p1, char* p2){int i = 0;i = strcmp(p1, p2);if (i == 0){return p1;}else{return p2;}}int main(){char* (*tty)(char* p1, char* p2);   //tty为一个函数指针tty = &Fun;(*tty)("aa", "bb");system("pause");return 0;}


C语言实现继承、多态

在C语言中,可以利用“结构在内存中的布局与结构的声明具有一致的顺序”这一事实实现继承。

//用一个函数指针typedef void(*FUN)();          //父类struct AA{FUN fun;};//子类struct BB{AA a;};void FunA(){printf("AA::fun\n");}void FunB(){printf("BB::fun\n");}

void Test(){AA a;BB b;a.fun = FunA;   //父类对象调用父类函数b.a.fun = FunB;   //子类对象调用子类函数AA* p = &a;   //定义一个父类指针指向父类对象p->fun();    //调用父类的fun函数p = (AA*)&b;   //父类指针指向子类对象p->fun();    //调用子类的fun函数}int main(){Test();system("pause");return 0;}