博客标题:C++中的继承:构建面向对象的基石

目录

​编辑

引言

继承的基本形式

示例1:基本继承

继承的类型

示例2:不同类型的继承

多重继承

示例3:多重继承

继承与多态性

示例4:继承与多态

结论

结尾


引言

在面向对象编程(OOP)中,继承是一个核心概念,它允许创建新的类,这些新类可以从现有类那里继承属性和行为。在C++中,继承被广泛用于代码复用、模块化以及实现多态性。本文将深入探讨C++中继承的特性和优势,通过多个代码示例来阐述其应用和注意事项。

继承的基本形式

继承允许一个类(子类或派生类)从另一个类(父类或基类)那里获取属性和方法。这样可以减少重复代码,同时保持代码的清晰性和可维护性。

示例1:基本继承
#include <iostream>class Animal {
public:void speak() const {std::cout << "Some sound" << std::endl;}
};class Dog : public Animal {
public:void speak() const override {std::cout << "Woof!" << std::endl;}
};int main() {Dog myDog;myDog.speak(); // 输出: Woof!return 0;
}

在这个例子中,Dog类从Animal类继承了speak方法,并进行了覆盖,使其输出更具体的声音。

继承的类型

C++支持多种继承类型,包括公有继承(public)、保护继承(protected)和私有继承(private)。每种继承类型控制着基类成员对派生类及派生类之外的可访问性。

示例2:不同类型的继承
#include <iostream>class Base {
protected:int protectedData;
private:int privateData;
};class PublicDerived : public Base {
public:PublicDerived() { protectedData = 10; } // 可以访问protectedData
};class PrivateDerived : private Base {
public:PrivateDerived() { protectedData = 20; } // 编译错误,不能直接访问protectedData
};int main() {PublicDerived pd;// pd.protectedData; // 编译错误,在类外不可访问PrivateDerived pd2;// pd2.protectedData; // 编译错误,即使在派生类内也不能直接访问return 0;
}
多重继承

C++还支持多重继承,即一个类可以继承多个基类。这在某些情况下非常有用,但也会导致复杂性增加,例如钻石问题(diamond problem)。

示例3:多重继承
#include <iostream>class InterfaceA {
public:virtual void methodA() const = 0;
};class InterfaceB {
public:virtual void methodB() const = 0;
};class Concrete : public InterfaceA, public InterfaceB {
public:void methodA() const override {std::cout << "Method A called." << std::endl;}void methodB() const override {std::cout << "Method B called." << std::endl;}
};int main() {Concrete obj;obj.methodA();obj.methodB();return 0;
}
继承与多态性

继承与虚函数结合可以实现多态性,允许使用基类指针或引用调用派生类的方法,这增强了程序的灵活性和可扩展性。

示例4:继承与多态
#include <iostream>class Shape {
public:virtual void draw() const {std::cout << "Drawing shape..." << std::endl;}
};class Circle : public Shape {
public:void draw() const override {std::cout << "Drawing circle..." << std::endl;}
};class Square : public Shape {
public:void draw() const override {std::cout << "Drawing square..." << std::endl;}
};int main() {Shape* shapes[] = {new Circle(), new Square()};for (auto shape : shapes) {shape->draw();}for (auto shape : shapes) {delete shape;}return 0;
}
结论

继承是C++中一个强大而灵活的概念,它能够促进代码的复用和模块化,同时也是实现多态性的关键。然而,不当的使用也可能导致代码复杂度上升和潜在的问题。理解继承的细节和限制,能够帮助开发者更加有效地利用这一特性,构建出既强大又健壮的软件系统。

结尾

通过本文的讨论和示例,我们不仅了解了C++中继承的基础知识,还探索了其不同形式和与多态性的紧密联系。继承是构建面向对象设计的基石之一,掌握其精髓将使你成为更优秀的C++程序员。下次当你设计类结构时,不妨考虑一下如何巧妙地运用继承来增强代码的可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】

一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox&#xff0c;和Vmware是一样的&#xff0c;只是box更轻量级 1&#xff09;需要注意内存选择&#xff0c;4G 2、启动完成后&#xff0c;需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具&#xff0c;进…

新手教学系列——crontab 使用不当引发的服务器性能问题

起因及症状 最近,我们的一台服务器随着运行时间的增加,逐渐出现了压力过大的问题。具体表现为数据库连接数飙升至 4000+,Redis 频繁超时,系统报错文件打开数过多等。针对这些问题,我们逐一检查了数据库连接池、Redis 连接池以及系统的 ulimit 配置,但都未能找到问题的根…

第241题| 确定极限中参数问题 | 武忠祥老师每日一题

解题思路&#xff1a;确定极限中的参数的方法是求这个极限&#xff1b;求极限根据类型选方法。 形可以用到三种方法&#xff1a;洛必达&#xff0c;等价&#xff0c;泰勒。 先观察题目&#xff0c;将看成一个整体&#xff0c;同时,并令,整理之后如下&#xff1a; 这里也要想办…

mysql怎么调整缓冲区大小

MySQL中调整缓冲区大小是数据库性能优化的重要一环。缓冲区大小直接影响了数据库的读写性能和响应速度。以下是一些常见的MySQL缓冲区及其调整方法&#xff1a; 一、InnoDB缓冲池&#xff08;InnoDB Buffer Pool&#xff09; InnoDB缓冲池是InnoDB存储引擎用来缓存表数据和索…

代码随想录第7天 454 、 383 、15、18

代码随想录第7天 454. 四数相加 II 思路就是先统计nums1和num2各个元素之和出现的次数&#xff0c;然后遍历num3和nums4各个元素之和&#xff0c;看其相反数是否在map中&#xff0c;若在加上出现次数 class Solution { public: int fourSumCount(vector<int> &num…

nginx.conf配置文件

1、全局模块 worker_processes 1; 工作进程数&#xff0c;一般设置成服务器内核数的2倍&#xff08;一般不超过8个&#xff0c;超过8个反而会降低性能&#xff0c;一般是4个&#xff0c;1-2个也可以&#xff09; 处理进程的过程必然涉及配置文件和展示页面&#xff0c;也就是…

高斯过程的定义

高斯过程 1. 高斯过程的定义2. 协方差矩阵的构建3. 协方差矩阵的性质3.1. 计算挑战3.2. 解决方法 1. 高斯过程的定义 高斯过程可以看作是对函数的分布&#xff0c;它假定任何有限数量的函数值的集合服从一个多元高斯分布。给定输入数据点集合 { x 1 , x 2 , … , x n } \left…

2024.7.9作业

1、提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格以及其他字符的个数 #include <stdio.h> #include <string.h> int main(int argc,const char *argv[]) { char arr[30]{0}; int zm0,kg0,sz0,qt0; printf("请输入字符串&…

OpenStack是一个开源的云计算平台

OpenStack是一个开源的云计算平台&#xff0c;由多个组件组成&#xff0c;这些组件协同工作&#xff0c;提供包括计算、网络、存储和身份服务在内的基础设施即服务(IaaS)。OpenStack最初由NASA和Rackspace合作开发&#xff0c;目的是创建一个开放源代码的云操作系统。 OpenSta…

智慧光伏一站式解决方案

光伏电站智慧化管理平台&#xff0c;将现代先进的数字信息技术、通信技术、互联网技术、云计算技术、大数据挖掘技术与光伏技术高度融合而形成。可以满足光伏企业对电站的高发电量、低初始投资、低运维成本等需求&#xff0c;从开发到运维的25年生命周期内&#xff0c;实现高收…

使用clion刷leetcode

如何优雅的使用clion刷leetcode 安装插件&#xff1a;LeetCode Editor) 插件配置&#xff1a; 这样我们每打开一个项目&#xff0c;就会创建类似的文件 我们的项目结构&#xff1a; 我们在题解文件中导入头文件myHeader.h并将新建的文件添加到cmakelists.txt文件&#xff0c;…

2024前端面试真题【JS篇】

DOM DOM&#xff1a;文本对象模型&#xff0c;是HTML和XML文档的编程接口。提供了对文档的结构化的表述&#xff0c;并定义可一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构、样式和内容。 DOM操作 创建节点&#xff1a;document.createElement()、do…

hnust 1965: 深度优先搜索

hnust 1965: 深度优先搜索 题目描述 输入一个图&#xff0c;用邻接矩阵存储&#xff08;实际上也可以选择邻接表&#xff09;&#xff0c;并实现DFSTraverse操作。 拷贝前面已经实现的代码&#xff0c;主函数必须如下&#xff0c;完成剩下的部分。 int main() { Graph g; Cre…

RTOS系统 -- 调试大法之FreeRTOS在M4上实现coredump功能

FreeRTOS内核崩溃&#xff08;coredump&#xff09;及异常打印技术 技术背景 在嵌入式系统中&#xff0c;FreeRTOS是一款广泛使用的实时操作系统。FreeRTOS本身并不包含默认的coredump机制&#xff0c;但我们可以通过自定义异常处理函数来实现异常打印和coredump功能。通过捕…

了解PPO算法(Proximal Policy Optimization)

Proximal Policy Optimization (PPO) 是一种强化学习算法&#xff0c;由 OpenAI 提出&#xff0c;旨在解决传统策略梯度方法中策略更新过大的问题。PPO 通过引入限制策略更新范围的机制&#xff0c;在保证收敛性的同时提高了算法的稳定性和效率。 PPO算法原理 PPO 算法的核心…

Oracle数据库自带的内置表和视图、常用内部视图

文章目录 一.Oracle数据库自带的内置表和视图1.dba_开头表2.user_开头表3.v$开头表4.all_开头表5.session_开头表6.index_开头表 三.按组分的几组重要的性能视图1.System的over view2.某个session的当前情况3.SQL的情况4.Latch/lock/ENQUEUE5.IO方面的 分类类别关系群集、表、视…

【docker 把系统盘空间耗没了!】windows11 更改 ubuntu 子系统存储位置

系统&#xff1a;win11 ubuntu 22 子系统&#xff0c;docker 出现问题&#xff1a;系统盘突然没空间了&#xff0c;一片红 经过排查&#xff0c;发现 AppData\Local\packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\ 这个文件夹竟然有 90GB 下面提供解决办法 步…

Spring-AOP(二)

作者&#xff1a;月下山川 公众号&#xff1a;月下山川 1、什么是AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是一种设计思想&#xff0c;是软件设计领域中的面向切面编程&#xff0c;它是面向对象编程的一种补充和完善&#xff0c;它以通过预编译方式和运行期…

【课程总结】Day13(下):人脸识别和MTCNN模型

前言 在上一章课程【课程总结】Day13(上):使用YOLO进行目标检测,我们了解到目标检测有两种策略,一种是以YOLO为代表的策略:特征提取→切片→分类回归;另外一种是以MTCNN为代表的策略:先图像切片→特征提取→分类和回归。因此,本章内容将深入了解MTCNN模型,包括:MTC…

CountDownLatch 是 Java 中的一个同步辅助工具类

下面是一个使用 CountDownLatch 的案例分析&#xff0c;我们将通过一个简单的示例来展示如何使用 CountDownLatch 来同步多个线程的操作。 ### 场景描述 假设我们有一个任务&#xff0c;需要从多个数据源&#xff08;比如多个数据库表或文件&#xff09;中读取数据&#xff0c…