从C语言的角度出发理解C++的封装继承和多态

2024-04-17 09:48

本文主要是介绍从C语言的角度出发理解C++的封装继承和多态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从C语言的角度出发理解C++的封装继承和多态

在学习C++面对对象程序设计的时候,会把C++类的使用和C结构体的使用作比较。以下内容是学习过程中思考的问题,从而总结出为什么要设计出C++的封装继承和多态。因为自己写C程序的时候也是以面对对象的思想来写(看过内核源码你就知道我在说什么),我们都知道C++是C语言的继承,而C++最明显的特征就是面对对象,那么C++是如何继承的,这是我思考的出发点

以下内容只是个人观点,不一定对,或者说只是想说只是想说服自己更好的理解C++

    • 从C语言的角度出发理解C的封装继承和多态
      • 封装Encapsulation
      • 继承Inheritance
      • 多态Polymorphism

封装Encapsulation

显然封装没有区别,为了完整性,把封装给贴出来了

首先明白什么是对象Object

Objects = Attributes + Services

程序里的封装就是对象Services的设计。封装的意义在于不直接操作数据。程序员很容易犯这样的错误,写着写着就伸到那个对象的里面去,直接去操数据

继承Inheritance

问题:C编程使用结构体嵌套,那么C++类的嵌套是什么?:一种就是——继承。在学习Linux设备驱动模型时,kobject就相当于是一个父类!!另外一种重要的方式是——组合。两种都可以使用,并没有谁是最好的,谁更合适应根据上下文决定或者混合使用。比如造车,继承应该是拿一个最基本的车来做父类,组合则是拿轮子拿引擎来拼装。再比如串口设备,应该是继承类device,然后组合串口。再比如子类不仅仅要包含一个父类,有时候要包含多个,那就只能使用组合了。

例子较简单就不写了

可以尝试一个类引用另一个类,即C编程中的结构体里面使用一个结构体类型的指针,真正需要用到时再malloc。参考博客:http://blog.csdn.net/kelvin_yan/article/details/44653145

多态Polymorphism

问题:C编程结构体内使用函数指针进行封装。比如open函数指针,不同设备open的方式不同,所以在C编程的时候,我可以定义几个不同的xxx_open函数然后再把地址给结构体里面的open。那么在C++类中要实现这种用法具体怎么做呢?(当然,C++完全可以像C一样的做法):多态

C version:

struct A{void (*open)(void);...
};struct A xxx;xxx.open = xxx_open;
struct A yyy;yyy.open = yyy_open;
struct A zzz;zzz.open = zzz_open;

C plus version:

class A{
public:virtual void open();
};class XXX:public A{
public:virtual void open();
};class YYY:public A{
public:virtual void open();
};class ZZZ:public A{
public:virtual void open();
};

对于这个问题,可能会感觉怪怪的,可能感觉多态并不适合这个场景。C版本是用一个结构体抽象所有设备,那么C++也应该要是用一个类来抽象所有设备(当然,C++完全可以像C一样的做法),多态,多态的意义是接口重用,也就是两者的思想是一样的,就是一个接口,多种方法。但是代码表现可以说是不一样的,从代码的表现很难去关联到多态设计的出发点。

尝试站在一个更广范围思考问题。举个例子,三角正方圆形,C版本是设计一个shape结构体,重要的是还要设计三个画图函数draw。同样C++也要设计三个画图函数draw,并设计出来了三个类。显然C比较灵活,C++更好的保护了数据。

似乎比较麻烦,我一开始也是不太喜欢多态,但是考虑一个问题:如果现在不是考虑不同形状问题,而是考虑我要多个相同形状的对象,比如要三个三角形,那么C版本就要绑定三次,而C++只要用子类去定义三个对象就可以了。(终于说服自己接收多态了)

要对C++融会贯通,确实不是一件容易的事,仁者见仁智者见智

更详细的介绍可以参考其他博客:http://blog.csdn.net/hackbuteer1/article/details/7475622


从这个问题还引出一个问题: c++子类和父类成员函数重名

参考了这篇博客的总结:http://blog.csdn.net/wxq1987525/article/details/6619529

  1. 子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。
  2. 子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。
  3. 子类和父类参数不同,函数名相同,有virtual关键字,则不存在多态性,子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。
  4. 子类和父类返回值不同,参数相同,函数名相同,有virtual关键字,则编译出错error C2555编译器不允许函数名参数相同返回值不同的函数重载。

还是那句话,没有谁最好,而是不同场景谁更合适的问题

这篇关于从C语言的角度出发理解C++的封装继承和多态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/911463

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示