一、继承机制中派生类中的 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 】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 ) 博客 , 静态成员需要
- 先在类中定义静态变量 ,
class Parent {
public:
// 父类静态成员
static int c;
};
- 然后在外部声明 并进行初始化 , 该步骤的作用是 告诉编译器 , 为 静态变量 分配内存 , 否则不分配内存 编译会报错 ;
// 声明并初始化静态变量
// 如果没有该操作 , 静态成员不可用
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 . . .