同名静态成员处理
#include<iostream>
using namespace std;
//继承中的同名静态成员处理方式
class Base
{
public:
static int m_A;
static void func()
{
cout << "Base - static void func()" << endl;
}
static void func(int a)
{
cout << "Base - static void func(int a)" << endl;
}
};
int Base::m_A = 100;
class Son :public Base
{
public:
static int m_A;
static void func()
{
cout << "Son - static void func()" << endl;
}
};
int Son::m_A=200;
//同名静态成员属性
void test01()
{
//1、通过对象访问
Son s;
cout << "Son 下 m_A= " << s.m_A << endl;
cout << "Base 下 m_A= " << s.Base::m_A << endl;
//2、通过类名访问
cout << "Son 下 m_A= " << Son::m_A << endl;
//第一个::代表通过类名方式访问 第二个::代表访问父类作用域下
cout << "Base 下 m_A= " << Son::Base::m_A << endl;
}
//同名静态成员函数
void test02()
{
//1、通过对象访问
Son s;
s.func();
s.Base::func();
//2、通过类名访问
Son::func();
Son::Base::func();
//子类出现和父类同名静态成员函数,也会隐藏父类中所有同名成员函数
//如果想访问父类中被隐藏同名成员,需要加作用域
Son::Base::func(100);
}
int main() {
//test01();
test02();
return 0;
}
继承中的同名静态成员处理方式
在面向对象编程中,继承中的同名静态成员涉及到属性和方法的继承、隐藏和访问问题。
1. 同名静态成员属性处理
在类 Base
中定义了静态成员属性 m_A
,并在类外初始化为 100。类 Son
继承自 Base
,并重新定义了同名的静态成员属性 m_A
,并在类外初始化为 200。
-
通过对象访问:
Son s; cout << "Son 下 m_A= " << s.m_A << endl; cout << "Base 下 m_A= " << s.Base::m_A << endl;
输出结果分别为
Son 下 m_A= 200
和Base 下 m_A= 100
,说明通过对象可以访问子类和父类的静态成员属性。 -
通过类名访问:
cout << "Son 下 m_A= " << Son::m_A << endl; cout << "Base 下 m_A= " << Son::Base::m_A << endl;
输出结果分别为
Son 下 m_A= 200
和Base 下 m_A= 100
,使用类名访问可以指明具体是哪个类的静态成员属性。
2. 同名静态成员函数处理
类 Base
中定义了两个同名的静态成员函数 func()
,一个无参数版本和一个带一个 int
参数的版本。类 Son
中重新定义了同名的静态成员函数 func()
。
-
通过对象访问:
Son s; s.func(); // 输出结果为 "Son - static void func()" s.Base::func(); // 输出结果为 "Base - static void func()"
子类中重新定义的静态成员函数会隐藏父类中同名的所有静态成员函数,可以通过对象和作用域解析运算符
::
访问父类中被隐藏的同名函数。 -
通过类名访问:
Son::func(); // 输出结果为 "Son - static void func()" Son::Base::func(); // 输出结果为 "Base - static void func()"
通过类名访问静态成员函数时,同样可以明确调用子类或父类中的函数版本。
-
访问父类被隐藏的同名静态成员函数:
Son::Base::func(100); // 输出结果为 "Base - static void func(int a)"
使用作用域解析运算符可以访问父类中被隐藏的同名静态成员函数。
3. 总结
继承中的同名静态成员处理方式涉及到作用域、继承、隐藏和访问规则:
- 静态成员属性和函数可以被子类重新定义和隐藏。
- 通过对象或类名结合作用域解析运算符
::
可以访问特定类中的静态成员。 - 子类重新定义的同名静态成员会隐藏父类中的同名成员,但可以通过作用域解析访问父类中被隐藏的成员。