c++ 继承 学习总结3 继承中父类和子类同名非静态成员或者同名静态成员的处理方式

2023-05-16

1.继承中父类和子类有同名非静态成员的处理方式

eg:

#include <iostream>
using namespace std;
class Base {
public:
	Base()
	{
		m_A = 100;
	}

	void func()
	{
		cout << "Base - func()调用" << endl;
	}

	void func(int a)
	{
		cout << "Base - func(int a)调用" << endl;
	}

public:
	int m_A;
};


class Son : public Base {
public:
	Son()
	{
		m_A = 200;
	}

	//当子类与父类拥有同名的成员函数,子类会隐藏父类中所有版本的同名成员函数
	//如果想访问父类中被隐藏的同名成员函数,需要加父类的作用域
	void func()
	{
		cout << "Son - func()调用" << endl;
	}
public:
	int m_A;
};

void test01()
{
	Son s;

	cout << "Son下的m_A = " << s.m_A << endl;
	cout << "Base下的m_A = " << s.Base::m_A << endl;

	s.func();
	s.Base::func();
	s.Base::func(10);

}
int main() {

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

例子中:

子类和父类都有m_A的成员变量,

访问子类的m_A直接访问(s.m_A),访问父类的m_A需要加作用域(s.Base::m_A).

子类和父类都有func()成员,

访问子类的m_A直接访问(s.func()),访问父类的m_A需要加作用域(s.Base::func()).

特殊的是:

即使父类中存在同名函数func(int a),表面上看起来可能会发生函数重载,我们想通过s.func(1)这样的方法直接访问父类中的func(int a)函数。

但实际上当子类和父类有同名函数存在的时候,系统会自动屏蔽父类中的所有版本的同名成员函数,即使是函数重载版本的同名成员函数,若想访问,依旧需要加父类作用域,例如s.Base::func(1)。

2.继承中父类和子类有同名静态成员的处理方式

#include <iostream>
using namespace std;
class Base {
public:
	static void func()
	{
		cout << "Base - static void func()" << endl;
	}
	static void func(int a)
	{
		cout << "Base - static void func(int a)" << endl;
	}

	static int m_A;
};

int Base::m_A = 100;

class Son : public Base {
public:
	static void func()
	{
		cout << "Son - static void func()" << endl;
	}
	static int m_A;
};

int Son::m_A = 200;

//同名成员属性
void test01()
{
	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	cout << "Son  下 m_A = " << s.m_A << endl;
	cout << "Base 下 m_A = " << s.Base::m_A << endl;

	//通过类名访问
	cout << "通过类名访问: " << endl;
	cout << "Son  下 m_A = " << Son::m_A << endl;
	cout << "Base 下 m_A = " << Son::Base::m_A << endl;
}

//同名成员函数
void test02()
{
	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	s.func();
	s.Base::func();

	cout << "通过类名访问: " << endl;
	Son::func();
	Son::Base::func();
	//出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问
	Son::Base::func(100);
}
int main() {

	//test01();
	test02();

	system("pause");

	return 0;
}

同名静态成员处理方式和非静态成员处理方式一样,可以参照上面同名非静态成员的处理方式。

但由于静态成员自身的特性

(静态成员变量:1.数据只有一份,所有对象都共享同一份数据

                             2. 编译阶段就分配内存

                             3.类内声明,类外初始化

    静态成员函数:1.只能访问静态成员变量,不能访问非静态成员变量

                              2.所有对象都共享同一份函数实例)

存在两种访问方式(通过对象访问和通过类名访问),这里着重说一下这两种方式。

eg:

#include <iostream>
using namespace std;
class Base {
public:
	static void func()
	{
		cout << "Base - static void func()" << endl;
	}
	static void func(int a)
	{
		cout << "Base - static void func(int a)" << endl;
	}

	static int m_A;
};

int Base::m_A = 100;

class Son : public Base {
public:
	static void func()
	{
		cout << "Son - static void func()" << endl;
	}
	static int m_A;
};

int Son::m_A = 200;

//同名成员属性
void test01()
{
	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	cout << "Son  下 m_A = " << s.m_A << endl;
	cout << "Base 下 m_A = " << s.Base::m_A << endl;

	//通过类名访问
	cout << "通过类名访问: " << endl;
	cout << "Son  下 m_A = " << Son::m_A << endl;
	cout << "Base 下 m_A = " << Son::Base::m_A << endl;
}

//同名成员函数
void test02()
{
	//通过对象访问
	cout << "通过对象访问: " << endl;
	Son s;
	s.func();
	s.Base::func();

	cout << "通过类名访问: " << endl;
	Son::func();
	Son::Base::func();
	//出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问
	Son::Base::func(100);
}
int main() {

	//test01();
	test02();

	system("pause");

	return 0;
}

通过对象访问:

1.访问静态成员变量

s.m_A

s.Base::m_A

2.访问静态成员函数

s.func()

s.Base::func()
 

通过类名访问

1.访问静态成员变量

s::m_A

s::Base::m_A (访问s类作用域下的Base父类的m_A静态成员变量) (注意区分两个冒号的区别)

2.访问静态成员函数

s::func()

s::Base::func()(访问s类作用域下的Base父类的func()静态成员函数) (注意区分两个冒号的区别)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 继承 学习总结3 继承中父类和子类同名非静态成员或者同名静态成员的处理方式 的相关文章

  • kubelet Container runtime network not ready“ networkReady=“NetworkReady=false reason:NetworkPluginNo

    执行 xff1a systemctl status kubelet 报错信息 xff1a E1006 17 36 42 438319 433223 kubelet go 2373 34 Container runtime network n
  • 磁盘划分和磁盘格式化

    文章目录 列出装置的 UUID 等参数parted 列出磁盘的分区表类型与分区信息磁盘分区 xff1a gdisk fdisk用 gdisk 新增分区槽用 gdisk 删除一个分区槽 磁盘格式化 xff08 建立文件系统 xff09 XFS
  • tmux 最新版本安装

    tmux centos系统 安装依赖 yum install openssl devel wget https github com libevent libevent releases download release 2 1 12 st
  • 自动保存恢复tmux会话 关机重启再也不怕

    整个解决方案由三个tmux插件组成 需要注意的是 xff0c 使用这两个 Tmux 插件要求 Tmux 是 1 9 及以上版本 xff0c 如果不符合要求 xff0c 赶紧升级吧 可以参考 xff1a tmux安装最新版本 tpm xff1
  • parse error on line 1, column 4: bare “ in non-quoted-field

    golang报错 xff1a parse error on line 1 column 4 bare 34 in non quoted field 可能的原因是csv是windowns 导出的 xff0c 编码方式是UTF 8 BOM 方式
  • CPU和GPU性能指标收集

    这里的CPU是AMD的芯片 总的性能指标 Total mem Bw Total mem RdBw Total mem WrBw uperf PCIE 上行带宽 上行 网卡到内存 通过 uperf 查看 XGMI uperf NVLink 带
  • PX4 Bootloader解析

    1 引言 半年前入手了Pixhawk V2全套硬件 xff0c 编译好的开源固件也下了 xff0c 四轴也飞了 xff0c 一直想对这套开源飞控进行一个系统地解析 xff0c 由于工作原因一直没时间 最近翻开了PX4飞控源代码 xff0c
  • 进程内存使用

    查看进程内存使用 28028 是进程的pid top p 28028 还可以查看进程的status文件 xff1a cat proc 28028 status VmRSS对应的值就是物理内存占用 内存占用比较多的程序 ps aux sort
  • perf使用

    perf可记录高达700多种events事件 sudo perf list 可以查看可以perf的事件 sudo perf record F 999 e cpu clock faults a g p 28544 sleep 60 制定进程7
  • gperftools

    gperftools 实现了更高性能的多线程的malloc 实现 增加了极好的性能分析工具 gperftools 的前身是 pprof https github com google pprof sudo apt get install a
  • RDMA 设备查看

    1硬件检测 1 1检查硬件是否安装 确认硬件已安装 lspci tvm grep Mellanox 查看OFED驱动版本命令 如果没有驱动可以参考 https km sankuai com page 335338645 安装 rpm qa
  • spark 转换tfrecord 成parquet格式

    读取tfrecord 成parquet文件格式 read tfrecord py coding utf 8 34 34 34 读取tfrecord生成parquet文件格式 34 34 34 import os import time im
  • ffmpeg压缩视频

    安装ffmpeg conda install c conda forge x264 61 61 39 1 161 3030 39 ffmpeg 61 4 3 2 压缩mov视频 ffmpeg i movie mov c v libx264
  • AI行动,解放做表打工人

    1 atomecho 插件介绍 如果你是个 需要做财报 数据新闻的冤种 xff1b 或者是 网上有的我都想要 的囤积狂魔 xff1b 或是沉迷 Ctrl 43 C Ctrl 43 V 的做表工具人 那你一定不陌生 对不上的格式 找不到的数据
  • golang高性能rocksdb参数配置

    golang高性能rocksdb参数配置 import 34 errors 34 34 log 34 34 monorepo service autotable comm grocksdb 34 34 strings 34 34 githu
  • Linux doc和docx转换pdf

    准备工作 服务器安装libreoffice apt get install libreoffice 安装完成libreoffice后 xff0c 测试是否安装成功 soffice h 例子 把 tmp test docx 转换成 tmp t
  • 多个硬盘挂载到同一个目录

    同一目录无法重复挂载 xff0c 后挂载的会覆盖之前挂载的磁盘 但是现在需要将4块磁盘并行挂载 xff0c 该如何操作呢 xff1f 将2块磁盘合并到一个逻辑卷 进行挂载 基本知识 基本概念PV Physical Volume 物理卷物理卷
  • LeetCode 跳跃游戏 题解

    题述 xff1a 给定一个非负整数数组 nums xff0c 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 思路 xff1a 阅读题目我们可以发现只要数组里面没有0 我们就一
  • #error This file was generated by a newer version of protoc which is 【protoc版本问题】

    在github上下载自己适合的protoc版 xff08 我的环境是ubuntu18 04 ros melodic版本 xff09 gazebo9对应的最低版本protoc为3 0 0 我之前版本为3 14 0会提示目前文件由旧版本生成 x
  • Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    前段时间 xff0c 公司同事开发了一个小工具 xff0c 在工具执行过程中 xff0c UI 界面一直处于卡死状态 通过阅读代码发现 xff0c 主要是由于 Dispatcher BeginInvoke 方法使用不当导致的 本文将通过一个

随机推荐