纯C语言简单模拟C++的虚函数表

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
多态,面向接口编程等设计方法并没有绑定到任何特定的语言上,使用纯C也可以实现简单的多态概念。下面给出一个非常简单粗糙的例子,只为说明概念。

父类Animal定义
文件:animal.h

#ifndef ANIMAL_H
#define ANIMAL_H


/* 方法表, 类似于C++的虚函数表 */
typedef struct vtable vtable;
struct vtable
{
    void (*eat)();
    void (*bite)();
};

typedef struct Animal Animal;
struct Animal
{
    const vtable* _vptr;  /* 每一个对象都有一个指向虚表的指针*/
};

/*
 如果不用虚表的话,每个对象都要包含所有的接口函数指针, 而实际上所有同类型对象的这些指针的值是相同的,造成内存浪费。
 接口函数是和类型一对一的,而不是和对象一对一。
娱乐,C语言模拟C++虚函数多态性。 看有感,原来C语言可以这样玩。。仔细想想,C++不也是在汇编层面上的封装么。膜拜这些语言设计者,深谙计算机科学的精髓,真是长见识了。本文只是简单模拟多态,大体上就是C++虚函数表机制,并没有考虑类域与继承机制,真要讨论起来那就麻烦多了,推荐大家可以看看PY源码解析,里面有简单介绍。我拿传统的圆与正方形问题为例子,基类是Shape,每个类定义虚函数showShape(),从而体现多态 阅读详情

相关推荐

C语言中虚函数的实现及虚函数表解析

在C语言中,虚函数表的生成和使用是由编程人员手动管理的,编译器并不会自动生成虚函数表。当派生类对象被创建时,会在对象的内存布局中添加一个指针,指向派生类自己的虚函数表。虚函数的实现和虚函数表的解析是C语言中实现面向对象编程的基础。然而,需要注意的是,相比于C++中自动处理虚函数的机制,手动管理虚函数表需要更多的编码工作和注意事项。它是一个包含了虚函数地址的函数指针数组,每个派生类对象都有一个指向自己虚函数表的指针。本文将详细讨论在C语言中实现虚函数的方法,并解析虚函数表的内部结构。函数中,我们创建了一个。

pytorchCode的博客 452

c虚函数表

执行效果:对象内,首先存储的是“虚函数表指针”,又称“虚表指针”。然后再存储非静态数据成员。对象的非虚函数,保存在类的代码中!对象的内存,只存储虚函数表和数据成员(类的静态数据成员,保存在数据区中,和对象是分开存储的)添加虚函数后,对象的内存空间不变!仅虚函数表中添加条目多个对象,共享同一个虚函数表!使用继承的虚函数表Demo.cpp 加QQ:31795882发布于 2022-06-11 18:42...

qq_45035858的博客 407

c来实现虚函数

#include typedef struct { void (*draw)(void*); //虚函数 void (*rotate)(void*); }vtable; typedef struct { vtable *vptr; //虚表指针 }Shape; typedef struct { vtable *vptr; int x,y,w,h; }Re

zzmc的专栏 3771

c语言 虚函数,C语言模拟虚函数表

使用C语言模拟虚函数表的实现。/* 模似的虚函数表* pVtable vtable* 接口指针 ---> 虚函数表指针 ---> 指针函数1 --->* 指针函数2 ---> 对象实现* ...

weixin_31659095的博客 622

C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

转载:C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

qq_22677425的博客 314

C++虚函数表实现机制以及用C语言对其进行的模拟实现(加入了自己的思考和笔记)

本文探讨了C++虚函数的实现原理及其在C语言中的模拟方法。文章分析了C++对象的内存布局,指出类对象大小由成员变量内存对齐决定。重点对比了无虚函数与含虚函数的类对象差异:无虚函数时对象仅包含成员变量;而含有虚函数时,对象会包含一个指向虚函数表的指针(vptr),通过该表实现多态。作者表示后续将继续深入解析虚函数机制,并尝试用C语言模拟这一特性。文章强调了虚函数作为C++多态基础的重要性,认为理解其实现原理对掌握C++编程至关重要。

Atticus的博客 1638

C++ 虚函数表 vfptr

前言大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. 虚函数是实现多态(动态绑定)/接口函数的基础. 可以说: 没有虚函数, C++将变得一无是处!既然是C++的精髓, 那么我们有必要了解一下她的实现方式吗? 有必要! 既然C++是从C语言的基础上发展而来的

好记性不如烂笔头 2万+

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

这个问题主要考察的是C和C++的区别,以及C++中继承和多态的概念。C和C++的区别C语言是面向过程的语言,而C++是面向对象的过程。什么是面向对象和面向过程? 面向过程就是分析解决问题的步骤,然后用函数把这些步骤一步一步的进行实现,在使用的时候进行一一调用就行了,注重的是对于过程的分析。面向对象则是把构成问题的事进行分成各个对象,建立对象的目的也不仅仅是完成这一个个步骤,而是描述各个问题在解决的过

菜鸟成长记 1万+

C++ 虚函数表 vfptr详解

前言 大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. 虚函数是实现多态(动态绑定)/接口函数的基础. 可以说: 没有虚函数, C++将变得一无是处! 既然是C++的精髓, 那么我们有必要了解一下她的实现方式吗? 有必要! 既然C++是从C语言的基础上发展而来的, 那么我们可以尝试用C语言模拟实现吗? 有可能! 接下来, 就是我一步一步地来解析C++的虚函数的实

ambition_zhou的博客 1939

C语言模拟实现C++中的继承和多态

C语言模拟实现继承和多态虚函数表

风华绝代 1191

C++面试题之虚函数(表)实现机制

大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. 虚函数是实现多态(动态绑定)/接口函数的基础. 可以说: 没有虚函数, C++将变得一无是处!既然是C++的精髓, 那么我们有必要了解一下她的实现方式吗? 有必要! 既然C++是从C语言的基础上发展而来...

草上爬的博客 1万+

【转】C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

前言 大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. 虚函数是实现多态(动态绑定)/接口函数的基础. 可以说: 没有虚函数, C++将变得一无是处! 既然是C++的精髓, 那么我们有必要了解一下她的实现方式吗? 有必要! 既然C++是从C语言的基础上发展...

YZ状元的blog 320

使用c语言实现c++中虚函数机制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、虚函数机制二、C++实现虚函数三、C实现虚函数总结 前言 提示:这里可以添加本文要记录的大概内容: 众所周知C++是门面向对象的语言,其中三大特性是继承、封装和多态多态又分为动态和静态多态两种,其中静态多态指重载和隐藏,而动态多态指虚函数机制。本篇主要介绍动态多态的虚函数机制。 提示:以下是本篇文章正文内容,下面案例可供参考 一、虚函数机制   虚函数是指基类中使用virtual关键字修饰的成员函数,如果基类未实现该.

hqm178933的博客 2395
上一篇: 1987年C语言乱码大赛之最优秀单行代码
下一篇: 纯C语言实现简单封装继承机制
smstong
博客等级 码龄19年 1716粉丝 343原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值