c语言代码会动的小人_用C语言实现C++继承与多态

继承

继承就是当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 举个例子:人是动物,人具有动物的行为和属性,但人也有动物所不具备的行为和属性。

d77fed09188931da9cfa452ba0a8adaf.png
人与动物的行为和属性

继承的实现

本实现使用了组合的方式,即把基类作为派生类的成员变量之一。 但是一定要将基类放在派生类首部,这要基类和派生类的内存首部分布才一致。

/* 基类 */

36607531584168123f8c1455d7b3b6ff.png
内存布局示意图

在派生类中的构造函数需要调用基类的构造函数用于初始化,然后再将构造函数创建的基类对象拷贝到派生类中。 但由于是浅拷贝,即只拷贝了地址,没有拷贝地址的内容。所以要在派生类中加入基类指针成员变量,用于在析构函数释放内存。

typedef 

由于在c语言下没有类型检查功能,在调用创建的类函数时就十分不安全,在基类加入基类类型名和类大小成员变量可以解决这个问题。 基类类型名用于判断调用函数对象是否继承自该类,而类大小用于判断调用函数对象是基类还是派生类。(该方法只适用于线性继承,若有更合适的方法,请在评论区留下你宝贵的建议。)

37c5333a7b7bf309d507b31aed0b2a96.png
适用范围示意图
typedef 

多态

在上个例子中,人和动物都有会动的属性,但人的动作和动物的动作从表现上会有所不同。而多态就可以实现在同一个函数中,根据对象类型的不同,函数实现方式也不同。

多态的实现

c语言多态的实现,需要用到函数指针。函数名实际上是该函数代码存储空间的首地址,这个地址可以通过函数指针来存放。通过改变函数指针存储的地址就可以实现多态。

typedef 

示例代码

该代码将结合上述继承和多态的方法实现对基类函数进行重写:

/* animal.h */

结果如下:

eb1e5443e40a95993b3e6d83836b7daa.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我尽力回答您的问题。在C语言中,封装可以通过结构体来实现。结构体中的成员变量可以被定义为私有的,只能通过结构体提供的接口函数来访问。继承可以通过结构体嵌套来实现,子结构体可以继承父结构体中的成员变量和函数指针,并可以添加自己的成员变量和函数指针。多可以通过函数指针来实现,父结构体中的函数指针可以指向不同的子结构体中的同名函数,从而实现。 下面是一个示例代码,演示了如何在C语言实现封装、继承和多的特性: ```c #include <stdio.h> // 父结构体 typedef struct { int x; } Base; // 子结构体 typedef struct { Base base; // 嵌套父结构体 int y; } Derived; // 父结构体的接口函数 void setX(Base *base, int x) { base->x = x; } int getX(Base *base) { return base->x; } // 子结构体的接口函数 void setY(Derived *derived, int y) { derived->y = y; } int getY(Derived *derived) { return derived->y; } // 多的函数 void printX(Base *base) { printf("%d\n", base->x); } int main() { Derived d; setX(&d.base, 1); setY(&d, 2); printf("%d %d\n", getX(&d.base), getY(&d)); printX(&d.base); return 0; } ``` 在上面的示例代码中,我们定义了一个父结构体`Base`和一个子结构体`Derived`。`Derived`结构体嵌套了`Base`结构体,并添加了自己的成员变量`y`。我们也定义了一些接口函数来操作这些成员变量。`printX`函数是一个多的函数,可以接受`Base`结构体的指针作为参数,实现了多的特性。 希望这个示例代码可以帮助您更好地理解如何在C语言实现封装、继承和多的特性。如果还有其他问题,请随时询问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值