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

99 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

1 静态成员的特点

静态成员变量的特点: 所有对象都共享同一份数据,编译阶段就分配内存,类内声明,类外初始化。

静态成员函数特点: 只能访问静态成员变量,不能访问非静态成员变量。同时所有对象都共享同一份数据。

2 问题

子类继承父类的静态成员,而且是同名的。这个时候我们怎么访问子类的或者父类的? 问题:继承中同名的静态成员在子类对象上如何进行访问?

静态成员和非静态成员出现同名,处理方式一致

  • 访问子类同名成员 直接访问即可
  • 访问父类同名成员 需要加作用域

静态成员变量通过对象进行访问

示例:

using namespace std;
class Fat
{
public:
	static int a;
};
int Fat::a = 1;
//私有继承
class Son :public Fat
{
public:
	static int a;
};
int Son::a = 2;

void test()
{
	Son son;
	cout << "son.a = " << son.a <<endl;
	cout << "Fat.a = " << son.Fat::a << endl;
}
int main() {

	test();

	system("pause");

	return 0;
}

输出: son.a = 2 Fat.a = 1 请按任意键继续. . .

静态成员变量通过类名进行访问

void test()
{
	Son son;
	cout << "son.a = " << Son::a <<endl;
	cout << "Fat.a = " << Son::Fat::a << endl;
}

输出: son.a = 2 Fat.a = 1 请按任意键继续. . .

结论: 继承中的同名静态成员变量的处理方式。 这两对冒号的意思不一样: 第一个冒号:我要通过类名访问数据; 第二个冒号:作用域下的; 因为静态成员变量有两种访问方式:一、通过对象;二、通过类名;

静态成员函数通过对象进行访问

#include<iostream>
using namespace std;
class Fat
{
public:
	static void a()
	{
		cout << "Fat的成员函数" << endl;
	}
};
//私有继承
class Son :public Fat
{
public:
	static void a()
	{
		cout << "Son的成员函数" << endl;
	}
};

void test()
{
	Son son;
	son.a();
	son.Fat::a();
}
int main() {

	test();

	system("pause");

	return 0;
}

输出: Son的成员函数 Fat的成员函数 请按任意键继续. . .

静态成员函数通过类名进行访问

void test()
{
	Son son;
	Son::a();
	Son::Fat::a();
}

输出:

Son的成员函数 Fat的成员函数 请按任意键继续. . .

结论: 当子类出现了同名的成员函数或者成员,都会隐藏父类同名的成员或者成员函数,不管是不是重载。 子类出现和父类同名静态成员函数,也会隐藏父类中所有同名成员函数。不管是哪种方式访问父类中隐藏同名成员,需要加上作用域。

总结:同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)