C++继承中同名非静态成员与静态成员的处理(学习笔记)

非静态成员:

定义一个父类Base,子类Son

class Base
{
public:int m_A = 10;int m_B = 200;void fun(){cout << "父类函数" << endl;}void fun(int a){cout << a << endl;}
};
class Son : public Base
{
public:int m_A = 100;float m_B = 2000;void fun(){cout << "子类函数" << endl;}
};

1.当子类与父类拥有同名的成员变量时,子类将会隐藏父类中拥有同名的成员变量

void test01()
{
    Son s;
    cout << s.m_A << endl;//子类成员变量 100

    cout << s.m_B << endl;//子类成员变量 float型 2000
}

调用父类的成员变量需加作用域

void test02()
{
    Son s;
    cout << s.Base::m_A << endl;//通过作用域调用父类成员变量 10

    cout << s.Base::m_B << endl;//通过作用域调用父类成员变量 int型 200
}

2.当子类与父类拥有同名的成员函数,子类将会隐藏父类中拥有同名的成员函数

void test03()
{
    Son s;
    s.fun();//子类成员函数
}

调用父类的成员变量需加作用域

void test03()
{
    Son s;

    s.Base::fun();//通过作用域调用父类成员函数
    s.fun(10);//错误,函数中调用的参数太多 即:父类的重载版本也被隐藏

    s.Base::fun(10);//通过作用域调用父类成员函数
}

因此:只要是有相同名字的函数(不在乎是否重载,还是完全相同),父类的一切同名的成员函数都将被隐藏。

好处:子类调用与父类同名成员函数时,解决了二义性的问题(即子类的成员函数与父类的成员函数完全相同时,调用的是子类的成员函数,加作用域才调用的是父类的成员函数)

总结:

1.当子类与父类拥有同名的成员时,子类将会隐藏父类中拥有同名的成员。

2.子类对象通过加作用域的方式访问被隐藏的父类同名成员。

静态成员:

前提知识:

静态成员:静态成员不属于某个对象上,所有对象都共享同一份数据。

通过两者方式进行访问:1.通过对象进行访问 ;2.通过类名进行访问(需加作用域)。

原则:

1.静态成员变量创建时,类内声明,类外定义。

2.静态成员函数创建时,类内声明,类外定义 或 类内声明,类内实现。

同名静态成员处理方式和同名非静态成员一样: 

当子类与父类拥有同名的静态成员时,子类将会隐藏父类中拥有同名的静态成员。

只是有两种方式:

 通过对象 或者 通过类名 进行访问 再加作用域的方式访问被隐藏的父类同名成员。

class Base
{
public:static int m_A ;static int m_B ;static void fun(){cout << "A函数" << endl;}void fun(int a){cout << a << endl;}
};
int Base::m_A = 10;
int Base::m_B = 200;
class Son : public Base
{
public:static int m_A ;static float m_B ;static void fun(){cout << "B函数" << endl;}
};
int Son::m_A = 100;
float Son::m_B = 2000;

当子类与父类拥有同名的成员时,子类将会隐藏父类中拥有同名的成员

void test01()
{
    Son s;
    cout << s.m_A << endl;//通过对象
    cout << s.m_B << endl;//通过对象
    cout << Son::m_A << endl;//通过类名 
    cout << Son::m_B << endl;//通过类名 
    s.fun();//通过对象
    Son::fun();//通过类名
}

调用父类的成员需加作用域

void test02()
{
    Son s;
    cout << s.Base::m_A << endl;  //对象访问 通过作用域调用父类成员变量
    cout << s.Base::m_B << endl;  //对象访问 通过作用域调用父类成员变量

   //第一个:: 代表 类名访问 第二个:: 代表 访问父类作用域下
    cout << Son::Base::m_A << endl;  //类名访问 通过作用域调用父类成员变量
    cout << Son::Base::m_B << endl;  //类名访问 通过作用域调用父类成员变量
    s.Base::fun();  //通过作用域调用父类成员函数
    Son::Base::fun();  //类名访问  通过作用域调用父类成员函数
}

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

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

相关文章

GO的sql注入盲注脚本

之间学习了go的语法 这里就开始go的爬虫 与其说是爬虫 其实就是网站的访问如何实现 因为之前想通过go写sql注入盲注脚本 发现不是那么简单 这里开始研究一下 首先是请求网站 这里貌似很简单 package mainimport ("fmt""net/http" )func main() {res, …

C语言数据结构-----二叉树(3)二叉树相关练习题

前言 前面详细讲述了二叉树的相关知识&#xff0c;为了巩固&#xff0c;做一些相关的练习题 文章目录 前言1.某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff1f;2.下列数据结构中&#xff0c;不适合采用顺序存…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《市场环境下考虑全周期经济效益的工业园区共享储能优化配置》

这个标题涉及到工业园区中共享储能系统的优化配置&#xff0c;考虑了市场环境和全周期经济效益。以下是对标题中各个要素的解读&#xff1a; 市场环境下&#xff1a; 指的是工业园区所处的商业和经济背景。这可能包括市场竞争状况、电力市场价格波动、政策法规等因素。在这一环…

WordCloud—— 词云

【说明】文章内容来自《机器学习入门——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 wordcloud 是python的第三方库&#xff0c;称为词云&#xff0c;也成文字云&#xff0c;可以根据文本中的词频以直观和艺术化的形式展示文本中词语的重要性。 依赖于pillow …

kotlin 基础概览

继承类/实现接口 继承类和实现接口都是用的 : &#xff0c;如果类中没有构造器 ( constructor )&#xff0c;需要在父类类名后面加上 () &#xff1a; class MainActivity : BaseActivity(), View.OnClickListener 空安全设计 Kotlin 中的类型分为「可空类型」和「不可空类型」…

浏览器js中添加日志断点

一、需求 本地调试时&#xff0c;可以直接代码里使用console.log直接调试&#xff1b; 代码已更新到服务器&#xff0c;不想要提交代码&#xff0c;如何通过添加console.log调试呢 二、实现 使用浏览器添加日志断点的方式&#xff0c;当然vue这种打包的不可行哦 设置完成后…

【算法】bfs与dfs算法解决FloodFill(洪流)问题(C++)

文章目录 1. 什么是FloodFill问题2. 用什么方法解决FloodFill问题3. 具体例题773.图像渲染200.岛屿数量695.岛屿的最大面积130.被围绕的区域 1. 什么是FloodFill问题 一般floodfill问题可以描述为&#xff1a;给定一个二维矩阵&#xff0c;其中每个元素代表一个像素点&#xf…

setXxx getXxx 封装

1.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。 2.封装的理解和好处 (1)隐藏实现细节 方法(连接数据库)<-----调用(传入参数...) 只负责调…

寻找最大整数 C语言xdoj51

问题描述 从键盘输入四个整数&#xff0c;找出其中的最大值并将其输出。 输入说明 输入4个整数&#xff0c;用空格分隔 输出说明 输出值最大的一个整数 输入样例 25 99 -46 0 输出样例 99 #include <stdio.h>//寻找最大整数 int main() {int i, a[4]…

【Gradle】运行时一直要下载 gradle-8.5-bin.zip

如何解决 Downloading https://services.gradle.org/distributions/gradle-8.5-bin.zip 的问题 文章目录 1. 问题描述2. 解决方法1&#xff09;找到 gradle-wrapper.properties2&#xff09;修改 distributionUrl 对应的值 3. 验证 1. 问题描述 在执行 gradlew 命令的时候&…

【Shell命令】常用命令使用合集(由AI助力,持续更新)

在当前这个AI大语言模型横行的时代&#xff0c;如果还不尝试去使用它们&#xff0c;那可真的太out啦&#xff01; 本文不是介绍Shell命令如何使用的文章&#xff0c;仅仅是提出需求&#xff0c;让AI回答后&#xff0c;记录正确的答案&#xff0c;供日后快速参考&#xff08;本…

Java语言+二维数组+非递归实现五子棋游戏

以前做过一个C语言版五子棋&#xff1a;&#xff23;语言&#xff0b;二维数组&#xff0b;非递归实现五子棋游戏 现在做一个Java语言版五子棋&#xff0c;规则如下&#xff1a; 1&#xff64;白子为O; 2&#xff64;黑子为&#xff1b; 3&#xff64;白子先手&#xff1b;…

计算机入门了解

计算机入门了解 一&#xff0e; 语言方面学习 1. C/C: C是面向过程的语言&#xff0c;C是在C语言的基础上发展起来的语言&#xff0c;他兼容99%的C。C比C多了面向对象的开发思想&#xff0c;引入了类class等知识。C/C学习难度大。C更偏向于底层&#xff0c;C/C运行编译速度快…

【数据结构】(堆)Top-k|堆排序

目录 概念&#xff1a; 堆的实现 构建 初始化 销毁 插入元素 往上调整 删除堆顶元素 往下调整 返回堆顶元素 返回有效个数 是否为空 堆排序 Top-k问题 ​编辑 创建数据 堆top-k 概念&#xff1a; 堆是将数据按照完全二叉树存储方式存储到一维数组中&#xff…

[计网00] 计算机网络开篇导论

目录 前言 计算机网络的概念 计算机网络的分层 计算机网络的分类 网络的标准化工作和相关组织 计算机网络的性能指标 前言 计算机网络在我们的日常生活中无处不在 在网络会有各种各样的协议和封装 保证我们的信息完整,无误的在各个客户端之前传输 计算机网络的概念 四…

vue3写法

一. <script setup> 1. 引入组件 import Head from "./conponents/head.vue" 2. 声明变量 // 引入 ref import { ref } from vue const isNeedNav ref(true) 3. 声明方法 const changeLossd () > {lossdVisible.value !lossdVisible.value } 4.生…

java 之匿名内部类 与 Lambda 表达式

文章目录 Lambda 表达式&#xff1a;基本语法&#xff1a;例子&#xff1a; 匿名内部类&#xff1a;语法&#xff1a;例子&#xff1a; 对比&#xff1a;相似之处&#xff1a;区别&#xff1a;示例比较&#xff1a; Lambda 表达式&#xff1a; Lambda 表达式是 Java 8 引入的一…

从文字下乡到人人学英语

从建国到改革开放&#xff0c;从恢复高考到新式教育改革&#xff0c;中国飞速发展&#xff0c;文字需求也在不断增大&#xff0c;在“地球村”的时代下&#xff0c;我们要“习文字之变&#xff0c;顺时代发展。” 古言道&#xff1a;“仓颉作书&#xff0c;后稷作稼”&#xff…

UE4 去除重复纹理

如果直接连的话&#xff0c;效果如下&#xff1a; 就存在很多重复的纹理&#xff0c;如何解决这个问题呢&#xff1f; 将同一个纹理&#xff0c;用不同的Tilling&#xff0c;将Noise进行Lerp两者之间&#xff0c;为什么要这么做呢&#xff1f;因为用一个做清晰纹理&#xff0c;…

Maven 项目的三种打包方式与 pom.xml 文件中项目描述

目录&#xff1a; 定义项目的信息 本项目描述相关标签<parent> 标签<relativePath/> 标签<scope> 标签 Maven 三种打包方式 JARWARPOM 原文链接 — —