【b站黑马程序员C++视频学习笔记-继承同名静态成员处理方式】

本文详细探讨了C++中类继承时同名静态成员的处理和访问方式。静态成员变量和函数属于类本身,不依赖于对象实例,且静态成员变量在所有对象间共享。在子类中,同名静态成员不会隐藏父类的静态成员,可以通过作用域解析运算符访问。示例展示了如何通过对象和类名访问不同类的静态成员变量和函数,强调了访问父类静态成员的正确方法。
摘要由CSDN通过智能技术生成

继承同名静态成员处理方式

静态成员变量有以下几个特点:

  • 被类的所有对象所共享,在程序内部位于全局数据区,编译阶段就分配内存。只有一份数据,如果修改它的值,那么在所有对象中这个值都跟着改变了
  • 由于静态数据成员是类公有的,所以不能在构造函数初始化,应该类内声明,类外初始化
  • 访问静态成员有两种访问方法:通过对象访问、通过类名访问

静态成员函数有以下几个特点:

  • 属于整个类所有,没有this指针
  • 只能直接访问静态成员变量,如果要访问非静态成员,必须通过参数传递的方式得到相应的对象,然后进行访问
  • 访问静态成员函数有两种访问方法:通过对象访问、通过类名访问

当静态成员出现同名时,处理方式和非静态成员时一样的

  • 访问子类同名成员,只需要直接访问就行
  • 访问父类同名成员,需要加作用域

一、同名静态成员变量
通过两种方式来验证:

class Base//父类
{
public:
	static int mA;//静态成员变量类内声明
};
int Base::mA = 100;//类外初始化

class Son:public Base
{
public:
	static int mA;//类内声明
};
int Son::mA = 200;//类外初始化

//同名静态成员属性
void test01() {
	//1、通过对象访问
	cout << "通过对象访问:" << endl;
	Son s1;
	cout << "Son_mA的值为" << s1.mA << endl;//值为200
	cout << "Base_mA的值为" << s1.Base::mA << endl;//值为100

	//2、通过类名访问
	cout << "通过类名访问:" << endl;
	cout << "Son_mA的值为" << Son::mA<< endl;//值为200
	//第一个::代表通过类名方式访问,第二个::代表访问父类作用域下
	cout << "Base_mA的值为" << Son::Base::mA << endl;//通过类名访问父类作用域下的mA,值为100
}

运行结果如下:
在这里插入图片描述

二、同名静态成员函数

class Base//父类
{
public:
	static int mA;//静态成员变量类内声明
	static void func() {//静态成员函数
		cout << "Base-static void func()" << endl;
	}
};
int Base::mA = 100;//类外初始化

class Son:public Base
{
public:
	static int mA;//类内声明
	static void func() {//静态成员函数
		cout << "Son-static void func()" << endl;
	}
};
int Son::mA = 200;//类外初始化

//同名静态成员函数
void test02() {
	//1、通过对象访问
	cout << "通过对象访问:" << endl;
	Son s2;
	s2.func();//子类静态成员函数
	s2.Base::func();//父类静态成员函数

	//2、通过类名访问
	cout << "通过类名访问:" << endl;
	Son::func();//子类静态成员函数
	Son::Base::func(); //通过类名访问父类中的func()

}

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值