C++的面向对象学习(7):面向对象编程的三大特性之:继承

文章目录

  • 前言
  • 一、继承:继承的类除了拥有上一级类的共性,也拥有自己的特性。
  • 二、继承方式:公有继承(public inheritance)、私有继承(private inheritance)和保护继承(protected inheritance)
    • 1.公共继承
    • 2.保护继承
    • 3.私有继承
  • 三、子类实例化对象后,父类继承的成员哪些属于子类对象?
  • 四、子类继承了父类后,子类的构造与析构函数怎么被继承使用呢?
    • 1.继承的构造函数与析构函数执行顺序?
    • 2.父类如果写了构造函数,子类怎么写构造函数呢?
  • 五、父类子类出现同名成员变量处理方式
  • 六、多继承:一个类继承多个类
    • 1.语法:class 子类 : 继承方式 父类1, 继承方式 父类2
    • 2.缺点:如果不同父类存在变量或者函数重名的情况,子类就必须用作用域::来指定。可能会引起命名冲突和二义性问题。
  • 七、菱形继承方式
  • 总结:继承的重要性


前言

前面几节学的基本是两块内容:第一块是C++的一些特性,比如重载、引用、函数参数值传递与地址传递。第二块是面向对象编程的三大特性的其一:封装。封装中涉及了格式、成员变量和成员函数、访问权限、实例化对象、构造函数与析构函数、成员变量与成员函数的存储位置、this指针、友元声明、operator声明的运算符重载等知识。

现在就要接触到面向对象编程的三大特性的其二:继承。

一、继承:继承的类除了拥有上一级类的共性,也拥有自己的特性。

继承的主要优势在于代码的重用性和扩展性。通过继承,子类可以直接使用父类的属性和方法,无需重新编写相同的代码。这样可以减少代码的冗余,并提高代码的可维护性。同时,子类还可以在继承的基础上添加自己的特性,以满足特定的需求

在继承关系中,父类通常是一个更通用、抽象的类,而子类则是在父类基础上进行特化和扩展的类。子类可以通过继承获得父类的属性和方法,并且可以添加新的属性和方法,或者重写父类的方法以实现自己的逻辑。

继承还可以形成类的层次结构,使得代码的组织更加清晰和易于理解。通过继承,可以将类按照其关系进行分类和组织,形成一个类的层次结构,从而更好地组织和管理代码。
举个例子:

#include <iostream>
using namespace std;class Animal {
protected:string name;public:Animal(string name) {this->name = name;}void speak() {cout << "动物发出声音" << endl;}
};class Dog : public Animal {
private:string breed;public:Dog(string name, string breed) : Animal(name) {this->breed = breed;}void speak() {cout << "汪汪汪!" << endl;}void fetch() {cout << "狗狗正在追逐球" << endl;}
};int main() {Animal animal("动物");animal.speak();  // 输出:动物发出声音Dog dog("旺财", "哈士奇");dog.speak();  // 输出:汪汪汪!dog.fetch();  // 输出:狗狗正在追逐球return 0;
}

Animal类是父类,它有一个name属性和一个speak方法。Dog类是子类,它继承了Animal类,并且添加了一个新的属性breed(品种)和一个新的方法fetch(追逐)。

继承的语法:
class 子类: 继承方式 父类

子类也叫派生类,父类也叫基类。

二、继承方式:公有继承(public inheritance)、私有继承(private inheritance)和保护继承(protected inheritance)

在这里插入图片描述

1.公共继承

使用关键字public来指定继承方式。
子类继承了父类的公开成员和保护成员,但不继承父类的私有成员(即不能访问)。
父类的公开接口成员函数既可以让外部调用,也可以让子类调用。

2.保护继承

使用关键字protected来指定继承方式。
子类继承父类的公开成员和保护成员,且在子类中都变为保护成员,父类的私有成员仍然不能访问
父类的接口函数限制在子类和子类的派生类中,外部无法直接访问父类的成员

3.私有继承

使用关键字private来指定继承方式。
子类继承父类的公开成员和保护成员,且在子类中都变为私有成员,父类的私有成员仍然不能访问
私有继承将父类的接口隐藏起来,子类不能直接访问父类的成员函数,只能通过子类自己的公有成员或者友元函数来间接访问。

在这里插入图片描述
子类中无法访问父类私有的权限,但是可以访问公开和受保护的权限。
有几个注意的地方:
①保护权限的成员,只能在子类内部访问,而不能在外部的主函数里访问。
子类继承父类的protected变量,不能在主函数里用对象调用吗?
保护成员可以在子类内部和子类对象中访问,但不能在类外部直接访问。

②子类继承父类后,孙子类应该继承子类的哪些成员呢?
答:当子类继承父类后,孙子类会继承子类的所有成员,包括公有成员、保护成员和私有成员。孙子类可以直接访问子类的公有成员和保护成员,但无法直接访问子类的私有成员。继承的层次可以一直延续下去,每个子类都可以成为下一个子类的父类。

三、子类实例化对象后,父类继承的成员哪些属于子类对象?

在这里插入图片描述
儿子类继承了父类的三个不同权限的成员变量,自己有一个独特的成员变量,那sizeof(son)的结果到底是多少呢?
答案是子类的对象拥有了这四个变量的空间,即使父类有一个私有变量,子类只是不能访问,但实例化对象时也开辟了它的空间。

四、子类继承了父类后,子类的构造与析构函数怎么被继承使用呢?

1.继承的构造函数与析构函数执行顺序?

构造函数的继承:子类会继承父类的构造函数。当创建子类对象时,会先调用父类的构造函数,然后再调用子类自身的构造函数。这样可以确保父类的成员被正确初始化。

析构函数的继承:子类会继承父类的析构函数。当子类对象被销毁时,会先调用子类自身的析构函数,然后再调用父类的析构函数。这样可以确保父类的资源被正确释放。

2.父类如果写了构造函数,子类怎么写构造函数呢?

class father {
private:string name;int age;
protected:int money;
public:father() {name = "xiaogang";age = 38;money = 6000;address = "nanjing";}string address;
};

子类:

class son :public father {
public:son() {money = 5000;address = "beijing";height = 150;}int height;
};

也就是说,父类的构造函数在父类写好后,子类继承时就不能用默认构造函数去实例化对象了,而是要重新写一个含参的构造函数。

一定要注意一点:
子类的对象和父类的对象是完全不同的两个对象,他们各自的成员变量的地址是不同的。构造函数里面的赋值,也只是给自己的对象的成员变量赋值而已

int main() {father f;son son1;cout << son1.address << endl;//儿子是北京cout << f.address << endl;//父亲是南京return 0;
}

五、父类子类出现同名成员变量处理方式

举个例子,父类有个成员变量叫friends,子类也有一个成员变量叫friends。任何通过子类的对象去访问父类的同名成员变量呢?
使用作用域声明:

son1.father::friends
class father {
private:string name;int age;
protected:int money;
public:father() {name = "xiaogang";age = 38;money = 6000;address = "nanjing";friends = "limiing";}string address;string friends;
};class son :public father {
public:son() {money = 5000;address = "beijing";height = 150;friends = "xiaohong";}int height;string friends;
};int main() {father f;son son1;cout << son1.father::friends << endl;return 0;
}

对象son1调用了父亲作用域下的成员变量。

六、多继承:一个类继承多个类

1.语法:class 子类 : 继承方式 父类1, 继承方式 父类2

比如:class C : public A, public B

#include <iostream>
using namespace std;// 基类A
class A {
public:void displayA() {cout << "This is class A" << endl;}
};// 基类B
class B {
public:void displayB() {cout << "This is class B" << endl;}
};// 派生类C,继承自类A和类B
class C : public A, public B {
public:void displayC() {cout << "This is class C" << endl;}
};int main() {C c;c.displayA();  // 调用继承自类A的成员函数c.displayB();  // 调用继承自类B的成员函数c.displayC();  // 调用派生类C自己的成员函数return 0;
}

2.缺点:如果不同父类存在变量或者函数重名的情况,子类就必须用作用域::来指定。可能会引起命名冲突和二义性问题。

七、菱形继承方式

在这里插入图片描述

总结:继承的重要性

继承是C++中的一个重要特性,被广泛应用于面向对象编程中。在实际开发中,继承被广泛用于代码复用和扩展性设计。

下面是一些继承的常见应用场景:

实现类的层次结构:通过继承,可以将类组织成层次结构,从而更好地组织和管理代码。

代码复用:通过继承,可以将一个类的成员函数和成员变量复用到另一个类中,从而减少代码量,提高代码的可维护性和可重用性。

多态性:通过继承和虚函数,可以实现多态性,即同一个函数在不同的派生类中具有不同的实现。

接口设计:通过继承和抽象类,可以定义接口,从而实现代码的松耦合和可扩展性。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树顺序结构与堆的概念及性质(c语言实现堆)

上次介绍了树&#xff0c;二叉树的基本概念结构及性质&#xff1a;二叉树数据结构&#xff1a;深入了解二叉树的概念、特性与结构 今天带来的是&#xff1a;二叉树顺序结构与堆的概念及性质&#xff0c;还会用c语言来实现堆 文章目录 1. 二叉树的顺序结构2.堆的概念和结构3.堆…

独立站与跨境电商:电商生态的双翼

随着电子商务的快速发展&#xff0c;独立站和跨境电商已经成为电商生态中不可或缺的两个重要组成部分。它们各自具有独特的优势和特点&#xff0c;同时也存在着相互依存和相互促进的关系。本文将探讨独立站与跨境电商的优势、相互影响以及未来发展趋势&#xff0c;并通过代码示…

LTSpice仿真场效应管(FET)的方法

刚开始用LTSpice学习电子电路&#xff0c;发现添加 JFET 和 MOSFET 的方法与添加普通原件不一样&#xff0c;需要分两步完成。 第一步&#xff1a;选择元件 njf、pjf、nmos、pmos&#xff0c;分别对应 N Channel 的 JFET 和 P Channel 的 JFET&#xff1b;N Channel 的 MOSFET…

云安全是什么?有什么作用

随着云计算的普及和深入应用&#xff0c;云安全已成为企业和组织面临的重要挑战。云安全旨在保护云计算环境中的数据、应用程序和基础设施免受各种威胁和攻击&#xff0c;确保云计算环境的可用性、机密性和完整性。 云安全包括以下几个关键领域&#xff1a; 一、数据保护 数据…

vue 导出 HTML 结构为 Word 文档(.docx)-支持表格、css样式、图片

在 Web 开发中&#xff0c;有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档&#xff0c;以便更方便地分享和打印。本文将介绍如何使用 html-docx-js 和 file-saver 这两个 JavaScript 库&#xff0c;实现将 HTML 结构导出为 Word 文档的功能。 工具简介 1. html-d…

Redisson依赖冲突记录

前言&#xff1a;项目使用的springboot项目为2.7.X 依赖冲突一&#xff1a;springboot 与 redisson版本冲突 项目中依赖了 Lock4j&#xff0c;此为苞米豆开源的分布式锁组件 <dependency><groupId>com.baomidou</groupId><artifactId>lock4j-redisso…

matplotlib范围曲线简例

想在画&#xff08;平均&#xff09;loss 曲线时顺便表示方差&#xff0c;即每一个 epoch 的平均 loss 用 plot 画曲线&#xff0c;而在曲线周围用一个浅色区域表示方差。效果&#xff1a; 参考 [1-3]&#xff0c;用到 matplotlib.pyplot.fill_between 函数。为显示对浅色区及…

Git基础学习_p1

文章目录 一、前言二、Git手册学习2.1 Git介绍&前置知识2.2 Git教程2.2.1 导入新项目2.2.2 做更改2.2.3 Git追踪内容而非文件2.2.4 查看项目历史2.2.5 管理分支&#x1f53a;2.2.6 用Git来协同工作2.2.7 查看历史 三、结尾 一、前言 Git相信大部分从事软件工作的人都听说过…

网络的七层结构模型

网络的七层结构模型&#xff0c;亦称OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。以下是各层的主要功能&#xff1a; 从下往上分别是1-7&#xff0c;总共7层&#xff0c;每一层…

win部署stable-diffusion

win部署stable-diffusion 1.环境2.模型3.使用4.效果 1.环境 首先下载stable-diffusion-webui&#xff0c;这个包了一层ui&#xff0c;特别好用。 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git然后搭建conda环境。 这里的pytorch&#xff0c;自己去…

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 搭建环境说明 不同版本模型性能对比 不同版本对比 参数解释 模型解释 训练 训练示意代码 训练数据与.yaml配置方法 .yaml配置 数据集路径 标签数据说明 训练参数说明 训练过程示意及输出…

基于CNN神经网络的手写字符识别实验报告

作业要求 具体实验内容根据实际情况自拟&#xff0c;可以是传统的BP神经网络&#xff0c;Hopfield神经网络&#xff0c;也可以是深度学习相关内容。 数据集自选&#xff0c;可以是自建数据集&#xff0c;或MNIST&#xff0c;CIFAR10等公开数据集。 实验报告内容包括但不限于&am…

单列集合Collection常用api

集合体系结构 Collection Collection是单列集合的祖宗接口&#xff0c;它的功能是全部单列集合都可以继承使用的。 public static void main(String[] args) {//TODO Collection类 所有集合的接口 /*public boolean add(E e) 添加public void clear() …

数据库一般会采取什么样的优化方法?

数据库一般会采取什么样的优化方法&#xff1f; 1、选取适合的字段属性 为了获取更好的性能&#xff0c;可以将表中的字段宽度设得尽可能小。 尽量把字段设置成not null 执行查询的时候&#xff0c;数据库不用去比较null值。 对某些省份或者性别字段&#xff0c;将他们定义为e…

web一些实验代码—— JavaBean与EL标签

实验9&#xff1a; JavaBean与EL标签 使用javaBean和EL&#xff0c;完成注册和注册信息显示。 1、新建RegisterBean&#xff1b; package com.example.weeebbbb.the10;public class RegisterBean {private String user;private String pass;private String repass;private S…

python+django高校教材共享管理系统PyCharm 项目

本中原工学院教材共享平台采用的数据库是mysql&#xff0c;使用nodejs技术开发。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。系统所要实现的功能分析&#xff0c;对于现在网络方便的管理&…

2023年的Android开发:演进之年

2023年的Android开发&#xff1a;演进之年 在2023年&#xff0c;安卓开发迎来了许多新功能和里程碑&#xff0c;让我们来看看其中的一些关键功能。 Jetpack Compose 1.5.7 Jetpack Compose是一个用于构建安卓用户界面的工具&#xff0c;从Jetpack Compose 1.0到Jetpack Comp…

【人工智能新闻】2023年人工智能热门新闻

欢迎收看我们的特别版时事通讯&#xff0c;重点报道“2023年人工智能热门新闻”今年是人工智能领域的里程碑&#xff0c;展示了重塑技术和我们日常生活的突破性进步和创新。从大型企业投资到革命性的技术发布&#xff0c;2023年的每个月都带来了非凡的成就。 加入我们&#xf…

香橙派 ubuntu实现打通内网,外网双网络,有线和无线双网卡

当香橙派 ubuntu 连了有线&#xff0c;和无线时&#xff0c;默认请求外网时&#xff0c;只走一个网卡&#xff0c;如走了内网网卡&#xff0c;就只能访问内访问&#xff0c;访问不了外网&#xff1b;走了外网网卡就只能访问外网&#xff0c;访问不了内网&#xff1b; 实现双网…