this指针 和 类的继承

一、this指针

  • Human类的属性fishc与Human()构造器的参数fishc同名,但却是两个东西。
  • 使用this指针让构造器知道哪个是参数,哪个是属性。

this指针:指向当前的类生成的对象

this -> fishc = fishc

 当前对象(this)的属性(fishc ) =  参数 (fishc )

现在编译器就懂了,赋值操作符的左边将被解释为当前对象的 fishc 属性,右边将被解释为构造器的传入来的 fishc 参数。

注意:使用 this 指针的基本原则是:如果代码不存在二义性隐患,就不必使用 this 指针! 



二、类的继承

C++ 类的继承允许一个类(派生类 / 子类)获取另一个类(基类 / 父类)的属性和方法,实现代码复用与扩展。

(1)语法:class 子类名继承方式 父类名{...}

class Pig:public Animal{...}

 (2)案例

假设我们有一只乌龟和一只猪,它们都有一些共同特征:例如都有嘴巴会吃东西,都睡觉,都看会流口。
当然,它们也有不同的地方:例如乌龟会游泳,猪会爬树。。。。。。


那么我们就需要编写一个 Animal 类作为 Turtle类和 Pig 类的基类。
• 基类: 是可以派生出其他的类,也称为父类或超类。比如这里的 Animal 类是基类。
• 子类:是从基类派生出来的类,比如这里的 Turtle类和 Pig 类是子类。

#include <iostream>
#include <string>//父类 
class Animal
{
public:std::string mouth;void eat(); //方法声明 void sleep();void drool();
};//子类Pig类 
class Pig : public Animal
{
public:void climb();
};//子类Turtle类 
class Turtle : public Animal
{
public:void swim();
};//方法定义 
void Animal::eat()
{std::cout << "I'm eatting!" << std::endl;
}void Animal::sleep()
{std::cout << "I'm sleeping!Don't disturb me!" << std::endl;
}void Animal::drool()
{std::cout << "我是公的,看到母的我会流口水,我正在流口水。。。" << std::endl;
}void Pig::climb()
{std::cout << "我是一个只漂亮的小母猪猪,我会上树,我正在爬树,嘘。。。" << std::endl;
}void Turtle::swim()
{std::cout << "我是一只小甲鱼,当母猪想抓我的时候,我就游到海里。。哈哈。。" << std::endl;
}int main()
{Pig pig;Turtle turtle;pig.eat();turtle.eat();pig.climb();turtle.swim();return 0;
}

(3)继承方式(public、private、protected)

  • 公有继承(public:基类的公有和保护成员在派生类里保持原访问权限,私有成员不可直接访问
  • 私有继承(private:基类的公有和保护成员在派生类中变为私有成员,基类的私有成员在派生类中仍然不可直接被其他类访问
  • 保护继承(protected:基类的公有和保护成员在派生类中变为保护成员,基类的私有成员在派生类中不可直接被其他类访问

链接:访问控制--public、protected、private-CSDN博客 

(4)派生类的构造函数和析构函数 的 执行顺序

  • 派生类的构造函数会先调用基类的构造函数,然后再执行自身的构造函数体
  • 析构函数的执行顺序则相反,先执行派生类的析构函数,再执行基类的析构函数。
#include <iostream>
#include <string>//父类 
class BaseClass
{
public:BaseClass(); //父类构造器声明 ~BaseClass();//父类析构函数声明 void doSomething();//父类函数声明 
};//子类 
class SubClass : public BaseClass
{
public:SubClass();//子类构造器声明 ~SubClass();//子类析构函数声明 
};
//父类构造函数定义 
BaseClass::BaseClass()
{std::cout << "进入基类构造器。。。。。\n";std::cout << "我在基类构造器里边干了某些事。。。。\n\n";
}
//父类析构函数定义 
BaseClass::~BaseClass()
{std::cout << "进入基类析构器.......\n";std::cout << "我在基类析构器里边也干了某些事。。。。\n\n";
}
//父类函数声明 
void BaseClass::doSomething()
{std::cout << "我干了某些事。。。。\n\n";
}
//子类构造函数定义 
SubClass::SubClass()
{std::cout << "进入子类构造器.....\n";std::cout << "我在子类构造器里边还干了某些事.....\n\n";
}
//子类析构函数定义 
SubClass::~SubClass()
{std::cout << "进入子类析构器......\n";
}int main()
{SubClass subclass;subclass.doSomething();std::cout << "完事,收工!\n";return 0;
}

(5)带有参数的构造器的继承 

定义子类构造函数时:

Animal::Animal( std::string theName ){name = theName;
}
Pig::Pig( std::string theName ) : Animal( theName ){
}

#include <iostream>
#include <string>class Animal
{
public:std::string mouth;std::string name;//名字 Animal(std::string theName); //父类有参构造器 声明 void eat();void sleep();void drool();
};class Pig : public Animal
{
public:void climb();Pig(std::string theName); //Pig子类有参构造器 声明 
};class Turtle : public Animal
{
public:void swim();Turtle(std::string theName); //Turtle子类有参构造器 
};
//父类有参构造函数定义 
Animal::Animal(std::string theName)
{name = theName;
}void Animal::eat()
{std::cout << "I'm eatting!" << std::endl;
}void Animal::sleep()
{std::cout << "I'm sleeping!Don't disturb me!" << std::endl;
}void Animal::drool()
{std::cout << "我是公的,看到母的我会流口水,我正在流口水。。。" << std::endl;
}
//Pig子类有参构造函数定义 
Pig::Pig(std::string theName) : Animal(theName)  //重点!!! 
{
}void Pig::climb()
{std::cout << "我是一个只漂亮的小母猪猪,我会上树,我正在爬树,嘘。。。" << std::endl;
}
//Turtle子类有参构造函数定义 
Turtle::Turtle(std::string theName) : Animal(theName) //重点!!! 
{
}void Turtle::swim()
{std::cout << "我是一只小甲鱼,当母猪想抓我的时候,我就游到海里。。哈哈。。" << std::endl;
}int main()
{Pig pig("小猪猪");Turtle turtle("小甲鱼");std::cout << "这只猪的名字是: " << pig.name << std::endl;std::cout << "每只乌龟都有个伟大的名字: " << turtle.name << std::endl;pig.eat();turtle.eat();pig.climb();turtle.swim();return 0;
}

 注意在子类的构造器定义里的” :Animal(theName)” 语法含义是:

  • – 当调用 Pig () 构造器时(以 theName 作为输入参数), Animal ()构造器也将被调用( theName 输入参数将传递给它)。
  • – 于是,当我们调用 Pig pig(“ 小猪猪” ); 将把字符串 “小猪猪” 传递给 Pig () 和 Animal (),赋值动作将实际发生在 Animal () 方法里。 

(6)C++ 支持多重继承,即一个子类可以继承多个父类。



未完待续。。。

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

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

相关文章

使用PyTorch训练VGG11模型:Fashion-MNIST图像分类实战

本文将通过代码实战&#xff0c;详细讲解如何使用 PyTorch 和 VGG11 模型在 Fashion-MNIST 数据集上进行图像分类任务。代码包含数据预处理、模型定义、训练与评估全流程&#xff0c;并附上训练结果的可视化图表。所有代码可直接复现&#xff0c;适合深度学习初学者和进阶开发者…

汽车BMS技术分享及其HIL测试方案

一、BMS技术简介 在全球碳中和目标的战略驱动下&#xff0c;新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏"&#xff0c;其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标&#xff0c;更深刻影响着消费者对电动汽车的…

打造船岸“5G+AI”智能慧眼 智驱力赋能客船数智管理

项目介绍 船舶在航行、作业过程中有着严格的规范要求&#xff0c;但在实际航行与作业中往往会因为人为的疏忽&#xff0c;发生事故&#xff0c;导致人员重大伤亡和财产损失&#xff1b; 为推动安全治理模式向事前预防转型&#xff0c;实现不安全状态和行为智能预警&#xff0c…

C#二叉树

C#二叉树 二叉树是一种常见的数据结构&#xff0c;它是由节点组成的一种树形结构&#xff0c;其中每个节点最多有两个子节点。二叉树的一个节点通常包含三部分&#xff1a;存储数据的变量、指向左子节点的指针和指向右子节点的指针。二叉树可以用于多种算法和操作&#xff0c;…

WinForm真入门(11)——ComboBox控件详解

WinForm中 ComboBox 控件详解‌ ComboBox 是 WinForms 中一个集文本框与下拉列表于一体的控件&#xff0c;支持用户从预定义选项中选择或直接输入内容。以下从核心属性、事件、使用场景到高级技巧的全面解析&#xff1a; 一、ComboBox 核心属性‌ 属性说明示例‌Items‌下拉…

超详细解读:数据库MVCC机制

之前文章&#xff1a;Mysql锁_exclusivelock for update写锁-CSDN博客 中有提到通过MVCC来实现快照读&#xff0c;从而解决幻读问题&#xff0c;这里详细介绍下MVCC。 一、前言 表1&#xff1a;实例表t idk1122 表2&#xff1a;事务A、B、C的执行流程 事务A事务B事务Cstart …

【SpringCloud】从入门到精通【上】

今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了&#xff0c;虽然在看视频的时候也记了笔记&#xff0c;但是看完之后还是忘得差不多了&#xff0c;所以打算写一篇博客再温习一下内容。 课程坐标:黑马程序员SpringCloud微服务开发与实战 微服务 认识单体架构 单体架…

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…

AI平台如何实现推理?数算岛是一个开源的AI平台(主要用于管理和调度分布式AI训练和推理任务。)

数算岛是一个开源的AI平台&#xff0c;主要用于管理和调度分布式AI训练和推理任务。它基于Kubernetes构建&#xff0c;支持多种深度学习框架&#xff08;如TensorFlow、PyTorch等&#xff09;。以下是数算岛实现模型推理的核心原理、架构及具体实现步骤&#xff1a; 一、数算岛…

cesium项目之cesiumlab地形数据加载

之前的文章我们有提到&#xff0c;使用cesiumlab加载地形出现了一些错误&#xff0c;没有解决&#xff0c;今天作者终于找到了解决方法&#xff0c;下面描述一下具体步骤&#xff0c;首先在地理数据云下载dem数据&#xff0c;在cesiumlab中使用地形切片&#xff0c;得到terrain…

[Vue]App.vue讲解

页面中可以看见的内容不再在index.html中进行编辑&#xff0c;而是在App.vue中进行编辑。 组件化开发 在传统的html开发中&#xff0c;一个页面的资源往往都写在同一个html文件中。这种模式在开发小规模、样式简单的项目时会相当便捷&#xff0c;但当项目规模越来越大&#xf…

sql-labs靶场 less-1

文章目录 sqli-labs靶场less 1 联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…

蓝桥杯-小明的彩灯(差分)

问题描述&#xff1a; 差分数组 1. 什么是差分数组&#xff1f; 差分数组 c 是原数组 a 的“差值表示”&#xff0c;其定义如下&#xff1a; c[0] a[0]c[i] a[i] - a[i-1] &#xff08;i ≥ 1&#xff09; 差分数组记录了相邻元素的差值。例如&#xff0c;原数组 a [1, …

精品可编辑PPT | 基于湖仓一体构建数据中台架构大数据湖数据仓库一体化中台解决方案

本文介绍了基于湖仓一体构建数据中台架构的技术创新与实践。它详细阐述了数据湖、数据仓库和数据中台的概念&#xff0c;分析了三者的区别与协作关系&#xff0c;指出数据湖可存储大规模结构化和非结构化数据&#xff0c;数据仓库用于高效存储和快速查询以支持决策&#xff0c;…

最近api.themoviedb.org无法连接的问题解决

修改NAS的host需要用到SSH终端连接工具&#xff0c;比如常见的Putty&#xff0c;XShell&#xff0c;或者FinalShell等都可以&#xff0c;我个人还是习惯Putty。 1.输入命令“ sudo -i ”回车&#xff0c;提示输入密码&#xff0c;密码就是我们NAS的登录密码&#xff0c;输入的…

0.机器学习基础

0.人工智能概述&#xff1a; &#xff08;1&#xff09;必备三要素&#xff1a; 数据算法计算力 CPU、GPU、TPUGPU和CPU对比&#xff1a; GPU主要适合计算密集型任务&#xff1b;CPU主要适合I/O密集型任务&#xff1b; 【笔试问题】什么类型程序适合在GPU上运行&#xff1…

多类型医疗自助终端智能化升级路径(代码版.下)

医疗人机交互层技术实施方案 一、多模态交互体系 1. 医疗语音识别引擎 # 基于Wav2Vec2的医疗ASR系统 from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC import torchaudioclass MedicalASR:def __init__(self):self.processor = Wav2Vec2Processor.from_pretrai…

前端基础:React项目打包部署服务器教程

问题背景 我做了一个React框架的前端的Node项目&#xff0c;是一个单页面应用。 页面路由用的是&#xff0c;然后使用了React.lazy在路由层级对每一个不同页面进行了懒加载&#xff0c;只有打开那个页面才会加载对应资源。 然后现在我用了Webpack5对项目进行了打包&#xff…

【深度学习:理论篇】--Pytorch基础入门

目录 1.Pytorch--安装 2.Pytorch--张量 3.Pytorch--定义 4.Pytorch--运算 4.1.Tensor数据类型 4.2.Tensor创建 4.3.Tensor运算 4.4.Tensor--Numpy转换 4.5.Tensor--CUDA&#xff08;GPU&#xff09; 5.Pytorch--自动微分 &#xff08;autograd&#xff09; 5.1.back…

使用 Spring Boot 快速构建企业微信 JS-SDK 权限签名后端服务

使用 Spring Boot 快速构建企业微信 JS-SDK 权限签名后端服务 本篇文章将介绍如何使用 Spring Boot 快速构建一个用于支持企业微信 JS-SDK 权限校验的后端接口&#xff0c;并提供一个简单的 HTML 页面进行功能测试。适用于需要在企业微信网页端使用扫一扫、定位、录音等接口的…