【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )

2023-10-26 16:29:45 浏览数 (2)

一、继承机制中派生类中的 static 关键字

1、子类继承父类静态成员

子类继承父类静态成员 : 父类 ( 基类 ) 中 使用 static 关键字 定义的 静态成员变量 , 可以被所有的 子类 ( 派生类 ) 共享 ;

2、父类静态成员访问控制权限的改变

继承自 父类的 静态成员变量 , 仍然遵循 继承中 子类的 访问控制特性 ,

  • public 公有继承 : 父类成员 在 子类 中 , 访问控制权限 不变 , 共有 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ;
    • 父类中的 public 成员 仍然是 public 成员 ;
    • 父类中的 protected 成员 仍然是 protected 成员 ;
    • 父类中的 private 成员 仍然是 private 成员 ;
  • protected 保护继承 : 父类成员 在 子类 中 , 访问控制权限 变为 protected , 基类的 公有成员 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ;
    • 父类中的 public 成员 变为 子类中的 protected 成员 ;
    • 父类中的 protected 成员 仍然是 protected 成员 ;
    • 父类中的 private 成员 仍然是 private 成员 ;
  • private 私有继承 : 父类成员 在 子类 中 , 所有成员的访问控制权限 变为 private , 基类的 所有成员 都不可在子类中访问 ;
    • 父类中的 public 成员 变为 子类中的 private 成员 ;
    • 父类中的 protected 成员 变为 子类中的 private 成员 ;
    • 父类中的 private 成员 仍然是 private 成员 ;

3、子类如何访问父类静态成员

子类中 使用

代码语言:javascript复制
父类类名 :: 静态成员名
Parent::c = 20;

代码语言:javascript复制
子类类名 :: 静态成员名
Child::c = 40;

代码语言:javascript复制
对象名.静态成员名
child.c = 30;

的方式 , 访问 继承自 父类的 静态成员 ;

4、静态成员使用要点

参考 【C 】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 ) 博客 , 静态成员需要

  • 先在类中定义静态变量 ,
代码语言:javascript复制
class Parent {
public:
	// 父类静态成员
	static int c;
};
  • 然后在外部声明 并进行初始化 , 该步骤的作用是 告诉编译器 , 为 静态变量 分配内存 , 否则不分配内存 编译会报错 ;
代码语言:javascript复制
// 声明并初始化静态变量
// 如果没有该操作 , 静态成员不可用
int Parent::c = 10;

之后 , 才能使用 类的 静态成员 , 如果没有在类外部初始化 , 该静态成员是无法使用的 ;

二、完整代码示例


代码示例 :

代码语言:javascript复制
#include "iostream"
using namespace std;

class Parent {
public:
	// 父类静态成员
	static int c;
};

// 声明并初始化静态变量
// 如果没有该操作 , 静态成员不可用
// 主要作用是告诉编译器为静态变量分配内存
int Parent::c = 10;

class Child : public Parent {
public:
	void print()
	{
		// 类内部使用 Parent::c 或 c 访问静态变量
		cout << "Parent::c = " << Parent::c << " , c = " << c << endl;
	}
};

int main() {

	Child child;
	// 打印初始状态的值
	child.print();

	// 直接使用 父类
	Parent::c = 20;
	child.print();

	// 通过对象访问父类静态成员
	child.c = 30;
	child.print();

	// 使用 子类名称::静态成员名 访问父类静态成员
	Child::c = 40;
	child.print();

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

代码语言:javascript复制
Parent::c = 10 , c = 10
Parent::c = 20 , c = 20
Parent::c = 30 , c = 30
Parent::c = 40 , c = 40
Press any key to continue . . .

1 人点赞