C实现类、继承、多态
首先考虑用C实现类
- 肯定是要使用struct的,类的数据成员放在struct里面;
- 而类有构造函数、析构函数,这两个函数必须在struct外面,构造函数要分配struct空间并初始化struct成员,且返回一个指向struct的指针,析构函数要释放这些动态分配的空间;
- 成员函数如何实现呢?想想我们在C++访问成员函数是通过对象、指针、引用的,那么成员函数就最好在struct里面而不是像构造析构函数在struct外面,struct里面如何实现成员函数呢?可以使用函数指针,要构造函数中初始数据成员的同时也初始化这些函数指针,即初始化成员函数,同理析构函数也需要这样一个指针参数;
- 那么成员函数如何调用呢?C++中成员函数需要通过this指针访问数据成员,this指针是编译器添加的,这里我们调用函数指针对应的成员函数时传递一个指向struct的指针,通过这个指针我们就可以访问数据成员。
再考虑用C实现继承
- 继承可以通过在派生类对象中维护一个基类对象的指针来完成。
再考虑用C实现多态
- 在C++中,多态是通过在对象中安插一个指针指向该类的虚函数表,虚函数表的slot放着指向虚函数的指针,我们调用虚函数时使用对象中的指针和slot的索引即可;
- 在C中,为了实现多态,基类对象应该能够访问派生类对象,像实现继承一样,同样可以在基类对象是维护一个派生类对象的指针,那么这个指针的类型如何确定呢,可以使用void *类型,需要使用时强制转换即可;
- 我们在派生类的构造函数中初始化时,先调用基类的构造函数,再完成派生类数据成员的初始化,最后完成虚函数表的初始化,构造函数返回指向基类对象的指针;
- 虚函数表如何初始化呢?我们使用指向基类对象的指针来对基类中的虚函数进行初始化;
- 为实现多态,派生类的析构函数、成员函数需要使用指向基类对象的指针,即调用这些函数时传递一个指向基类对象的指针,这个指针也是构造函数返回的指针。
参考:C中的继承和多态。
C实现类、继承、多态的更多相关文章
- python 面对对象 类(继承, 多态)
继承,继承其它实例化样本的属性和方法,需要在声明里重新定义和使用 class School(object): def __init__(self, name, addr): self.name = n ...
- Python设计模式 - 基础 - 封装 & 继承 & 多态
面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...
- Java中关于继承、类、多态、接口的知识点
继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序 ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- 当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用
当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用
- python开发面向对象基础:接口类&抽象类&多态&钻石继承
一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...
- Day 23 类的继承,派生,组合,菱形继承,多态与多态性
类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...
- .NET Core CSharp初级篇 1-6 类的多态与继承
.NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...
- python(类的封装调用/继承/多态)
一.类的定义 类:用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例 对象:类实例化出来的叫做对象 对象和类的关系:类和对象的关系就像模具和铸 ...
- day18-Python运维开发基础(单继承 / 多继承 / 菱形继承、类的多态)
1. 单继承 / 多继承 / 菱形继承 # ### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 """ 一个类可以继承另外一个类,那 ...
随机推荐
- N层架构实现的一个小例子
主要用到了[单例,抽象工厂,缓存,N层,反射]等知识.架构图如下: 解决方案用到的项目列表如下: 在接口项目中,定义一个IUER接口. namespace IDAL { public interfac ...
- Nginx配置文件常用部分详解
原文 #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes ; #全局错误日志定义类型,[ debug ...
- eclipse的插件
jode_1.0.6(Java Optimize and Decompile Environment ) 非常好用的Eeclipse的反编译插件,随时点击,随时查看源代码,但他的官方下载的都是核心源码 ...
- 笔记:利用Cocos2dx 3.3 lua 做一个动作类游戏(一)
在这之前,声明一下: 做不完我是小狗. 没办法,没毅力和恒心,之前的那个Quick Cocos2dx做的横版过关游戏的demo已经转成了3.3的版本了,其实也算是个半成品,战斗,UI啥的都有了,呵呵. ...
- PAT (Advanced Level) 1083. List Grades (25)
简单排序. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。
In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...
- 《accelerated c++》---------第六章
本章主要讲了算法部分.就是<algoruthm>里面的算法.
- [DNS]ACL、also-notify、视图服务器及安全设置
1. ACL :访问控制列表放在named.conf的头部,如果acl的内容太多,可以另创建一个文件,将acl放在该文件中,再在主配置文件named.conf用include 将文件加载进来(记得放在 ...
- WeakHashMap和Java引用类型详细解析
WeakHashMap是种弱引用的HashMap,这是说,WeakHashMap里的key值如果没有外部强引用,在垃圾回收之后,WeakHashMap的对应内容也会被移除掉. 1.1 Java的引用类 ...
- mysql查看sql语句执行时间
原文地址: http://www.cnblogs.com/happySmily/p/5943311.html