继承同名静态成员处理方式
静态成员变量有以下几个特点:
- 被类的所有对象所共享,在程序内部位于全局数据区,编译阶段就分配内存。只有一份数据,如果修改它的值,那么在所有对象中这个值都跟着改变了
- 由于静态数据成员是类公有的,所以不能在构造函数初始化,应该类内声明,类外初始化
- 访问静态成员有两种访问方法:通过对象访问、通过类名访问
静态成员函数有以下几个特点:
- 属于整个类所有,没有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()
}
运行结果如下: