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

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

描述:

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

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


C++中的继承、多态

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

不同的东西。 

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

 如果你想学习C/C++可以来这个群,首先是三三零,中间是八五九,最后是七六六,里面可以学习和交流,也有学习资料可以可以下载。

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

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

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

[cpp] view plain copy

 

  1. #include <iostream>  
  2. #include <assert.h>  
  3. #include <Windows.h>  
  4. using namespace std;  
  5.   
  6. //C++中的多态  
  7. class AA  
  8. {  
  9. public:  
  10.     virtual void fun1()  
  11.     {  
  12.         cout << "AA::fun1()" << endl;  
  13.     }  
  14.     virtual void fun2()  
  15.     {  
  16.         cout << "AA::fun2()" << endl;  
  17.     }  
  18. private:  
  19.     int _aa;  
  20. };  
  21.   
  22.   
  23. class BB :public AA   //公有继承  
  24. {  
  25. public:  
  26.     virtual void fun1()     //子类重写父类的虚函数时,子类的virtual可以不写  
  27.     {  
  28.         cout << "BB::fun1()" << endl;  
  29.     }  
  30.     virtual void fun2()  
  31.     {  
  32.         cout << "BB::fun2()" << endl;  
  33.     }  
  34. private:  
  35.     int _bb;  
  36. };  

[cpp] view plain copy

 

  1. #include "源.h"  
  2.   
  3. void Test()  
  4. {  
  5.     AA tty;  
  6.     BB vvz;  
  7.     AA* p = &tty;   //父类指针指向父类引用  
  8.     p->fun1();      //父类指针指向父类对象  
  9.     p->fun2();  
  10.     p = &vvz;      //父类指针指向子类引用,多态体现  
  11.     p->fun1();     //父类指针指向子类对象  
  12.     p->fun2();  
  13. }  
  14.   
  15. int main()  
  16. {  
  17.     Test();  
  18.     system("pause");  
  19.     return 0;  
  20. }  


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


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

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

基本思想:

1.结构体

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

[cpp] view plain copy

 

  1. struct AA  
  2. {  
  3.     int a;  
  4.     char b;  
  5. }xxy;  

结构体可以嵌套,因而可以把一个结构体当成另一个结构体的成员,例:

[cpp] view plain copy

 

  1. struct AA  
  2. {  
  3.     int a;  
  4.     char b;  
  5. }xxy;  
  6.   
  7. struct BB  
  8. {  
  9.     int c;  
  10.     double q;  
  11.     struct AA tty;  
  12. }zzo;  

2.函数指针

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

[cpp] view plain copy

 

  1. //Fun函数为一个返回值为char* 的函数  
  2. char* Fun(char* p1, char* p2)  
  3. {  
  4.     int i = 0;  
  5.     i = strcmp(p1, p2);  
  6.     if (i == 0)  
  7.     {  
  8.         return p1;  
  9.     }  
  10.     else  
  11.     {  
  12.         return p2;  
  13.     }  
  14. }  
  15.   
  16. int main()  
  17. {  
  18.     char* (*tty)(char* p1, char* p2);   //tty为一个函数指针  
  19.     tty = &Fun;  
  20.     (*tty)("aa", "bb");  
  21.     system("pause");  
  22.     return 0;  
  23. }  


C语言实现继承、多态

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

[cpp] view plain copy

 

  1. //用一个函数指针  
  2. typedef void(*FUN)();            
  3.   
  4. //父类  
  5. struct AA  
  6. {  
  7.     FUN fun;  
  8. };  
  9.   
  10. //子类  
  11. struct BB  
  12. {  
  13.     AA a;  
  14. };  
  15.   
  16. void FunA()  
  17. {  
  18.     printf("AA::fun\n");  
  19. }  
  20.   
  21. void FunB()  
  22. {  
  23.     printf("BB::fun\n");  
  24. }  

[cpp] view plain copy

 

  1. void Test()  
  2. {  
  3.     AA a;  
  4.     BB b;  
  5.     a.fun = FunA;   //父类对象调用父类函数  
  6.     b.a.fun = FunB;   //子类对象调用子类函数  
  7.   
  8.     AA* p = &a;   //定义一个父类指针指向父类对象  
  9.     p->fun();    //调用父类的fun函数  
  10.     p = (AA*)&b;   //父类指针指向子类对象  
  11.     p->fun();    //调用子类的fun函数  
  12. }  
  13.   
  14. int main()  
  15. {  
  16.     Test();  
  17.     system("pause");  
  18.     return 0;  
  19. }  

时间: 2024-11-05 14:55:34

C语言模式实现C++继承和多态的相关文章

使用了继承、多态还有工厂模式和反射,但是还是没有OO的感觉。[已经增加了实现的代码]

最近项目里遇到了一个问题,为了解决这个问题"动用了"继承.多态还有工厂模式和反射,但是还是没有OO的感觉.呵呵. 先说一下具体情况: 1.使用短信猫来接收短信.简单的说,短信猫收到短信后会往指定的表里面填写数据. 2.接收到短信,然后根据短信前面的"标志"调用不同的方式来处理. 3.发送确认信息或者是错误提示. 4.想做成一个"通用"的模块,不管是什么项目,都可以使用这个程序来处理接收短信的问题.当然具体的处理方式要能很方便的修改或者扩充. 我的

Java中继承、多态、重载和重写介绍_java

什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

Objective-C中的继承和多态

面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多继承,为什么OC不支持多继承稍后将会提到.  说到继承呢,想到了一本书上是引用<大话西游>里的一句话来描述继承的."人是人他妈生的,妖是妖他妈生的!",想必里面的唐三藏也学过OOP编程,也许他们师徒四人去西天取什么算法导论呢,漫谈OOP编程啦,数据结构啦等这类的书去啦.人和妖都

C中的继承和多态

1.引言 继承和多态是面向对象语言最强大的功能.有了继承和多态,我们可以完成代码重 用.在C中有许多技巧可以实现多态.本文的目的就是演示一种简单和容易的技术,在C中应用继承和多态.通过创建一个VTable(virtual table)和在基类和派生类对象之间提供正确的访问,我们能在C中实现继承和多态.VTable能通过维护一张函数表指针表来实现.为了提供基类和派生 类对象之间的访问,我们可以在基类中维护派生类的引用和在派生类中维护基类的引用. 2.说明 在C中实现继承和多态之前,我们应该知道类(

javascript 面向对象全新理练之继承与多态_js面向对象

1 又是几个基本概念 为什么要说又呢? 在讨论继承时,我们已经列出了一些基本概念了,那些概念是跟封装密切相关的概念,今天我们要讨论的基本概念,主要是跟继承与多态相关的,但是它们跟封装也有一些联系. 1.1 定义和赋值 变量定义是指用 var a; 这种形式来声明变量. 函数定义是指用 function a(...) {...} 这种形式来声明函数. var a = 1; 是两个过程.第一个过程是定义变量 a,第二个过程是给变量 a 赋值. 同样 var a = function(...) {};

Java中的面向对象封装、抽象、继承、多态特点

 面向对象主要有四大特性:封装.抽象.继承和多态.各自定义: 封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性: 抽象:抽象就是将一类实体的共同特性抽象出来,封装在一个抽象类中,所以抽象在面向对象语言是由抽象类来体现的.比如鸟就是一个抽象实体,因为抽象实体并不

多语言模式并举: .NET语言和模式的调查

本文讨论: 面向对象的编程 函数式编程 动态编程 .NET 语言的新模式 本文使用了以下技术: C#.C++.F#.IronPython.IronRuby.Visual Basic Windows 操作系统 对编程人员而言是再合适不过的平台了.针对 Windows 的语言有数百种,它们有的直接 通过 Win32 API 或 CLR 来实现,但更多的还是通过您的编写来构建. CLR 的目标之一就是要在一个兼容的生态系统中让百花齐放,将语言和 API 无缝集成在同一运行时中 .到目前为止它已取得了巨

string-Android应用图标在不同语言模式下如何在launcher中显示不同的名称

问题描述 Android应用图标在不同语言模式下如何在launcher中显示不同的名称 谷歌自带Downloads应用,要在不同的语言模式下显示不同的图标名称,例如:当系统是在中文模式,Downloads应用图标显示的名字是"下载",在英文模式下,应用名称显示的是"downloads",在德文模式下,要显示的名称是"Herunterladen",我在values-de那个目录下的strings.xml文件中修改""Herunt

Objective-C 继承和多态

学习Java我们知道类有三大特征,封装,继承,多态.而在Objective-C中也有继承的概念,今天就来看看Objective-C中的继承和多态. 首先,我们来看看示例代码: //Animal.h #import <Foundation/Foundation.h> @interface Animal : NSObject { int food_consumption; //食量 int count; //数量 int parturition_days; //生产周期 } -(int)count