首先考虑用C实现类

  • 肯定是要使用struct的,类的数据成员放在struct里面;
  • 而类有构造函数、析构函数,这两个函数必须在struct外面,构造函数要分配struct空间并初始化struct成员,且返回一个指向struct的指针,析构函数要释放这些动态分配的空间;
  • 成员函数如何实现呢?想想我们在C++访问成员函数是通过对象、指针、引用的,那么成员函数就最好在struct里面而不是像构造析构函数在struct外面,struct里面如何实现成员函数呢?可以使用函数指针,要构造函数中初始数据成员的同时也初始化这些函数指针,即初始化成员函数,同理析构函数也需要这样一个指针参数;
  • 那么成员函数如何调用呢?C++中成员函数需要通过this指针访问数据成员,this指针是编译器添加的,这里我们调用函数指针对应的成员函数时传递一个指向struct的指针,通过这个指针我们就可以访问数据成员。

再考虑用C实现继承

  • 继承可以通过在派生类对象中维护一个基类对象的指针来完成。

再考虑用C实现多态

  • 在C++中,多态是通过在对象中安插一个指针指向该类的虚函数表,虚函数表的slot放着指向虚函数的指针,我们调用虚函数时使用对象中的指针和slot的索引即可;
  • 在C中,为了实现多态,基类对象应该能够访问派生类对象,像实现继承一样,同样可以在基类对象是维护一个派生类对象的指针,那么这个指针的类型如何确定呢,可以使用void *类型,需要使用时强制转换即可;
  • 我们在派生类的构造函数中初始化时,先调用基类的构造函数,再完成派生类数据成员的初始化,最后完成虚函数表的初始化,构造函数返回指向基类对象的指针;
  • 虚函数表如何初始化呢?我们使用指向基类对象的指针来对基类中的虚函数进行初始化;
  • 为实现多态,派生类的析构函数、成员函数需要使用指向基类对象的指针,即调用这些函数时传递一个指向基类对象的指针,这个指针也是构造函数返回的指针。

参考:C中的继承和多态

C实现类、继承、多态的更多相关文章

  1. python 面对对象 类(继承, 多态)

    继承,继承其它实例化样本的属性和方法,需要在声明里重新定义和使用 class School(object): def __init__(self, name, addr): self.name = n ...

  2. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

  3. Java中关于继承、类、多态、接口的知识点

    继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序 ...

  4. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  5. 当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用

    当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用

  6. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

  7. Day 23 类的继承,派生,组合,菱形继承,多态与多态性

    类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...

  8. .NET Core CSharp初级篇 1-6 类的多态与继承

    .NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...

  9. python(类的封装调用/继承/多态)

    一.类的定义 类:用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例   对象:类实例化出来的叫做对象   对象和类的关系:类和对象的关系就像模具和铸 ...

  10. day18-Python运维开发基础(单继承 / 多继承 / 菱形继承、类的多态)

    1. 单继承 / 多继承 / 菱形继承 # ### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 """ 一个类可以继承另外一个类,那 ...

随机推荐

  1. PHP 对MySQLI预处理的包装

    mysql 类 <?php class Mysql { private static $instance; private $link; private $query; private $stm ...

  2. php 中的魔术方法-----“事件方法”

    来源:http://lornajane.net/posts/2012/phps-magic-__invoke-method-and-the-callable-typehint php 中的这个对象 , ...

  3. PHP foreach 遍历数组是打印出相同的数据

    https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make PHP makes it relatively easy ...

  4. ibatis的动态sql

    1.介绍 <select id="getUsers" parameterClass="user" resultMap="get-user-res ...

  5. HDU 3874 Necklace

    莫队算法. #include<cstdio> #include<cstring> #include<cmath> #include<queue> #in ...

  6. CodeForces 618C CodeForces 618C

    第一反应是在凸包上随便找一条边,然后找剩下n-2个点里面距离这条边最短的一个点,这三点就构成了符合要求的三角形..然而..精度被卡死. 换种思路,随便找两个点P1,P2,找剩下n-2个点中哪一个点与P ...

  7. UVA 11255 Necklace

    带颜色数限制的polya计数. 其实感觉一样了... #include<iostream> #include<cstdio> #include<cstring> # ...

  8. macbook pro 突破校园网inode客户端限制分享网络

    [原创] 环境: 1. macbook pro (retina) 2. mac os x 10.9 3. H3C inode for mac 7.0 分享方法: 1.打开inode联网. 2.打开设置 ...

  9. [iOS] 响应式编程开发-ReactiveCocoa(一)

    什么是响应式编程 响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中 ...

  10. 机器学习模型 bias 和 variance 的直观判断

    假设我们已经训练得到 一个模型,那么我们怎么直观判断这个 模型的 bias 和 variance? 直观方法: 如果模型的 训练错误 比较大,并且 验证错误 和 训练错误 差不多一样,都比较大,我们就 ...