C++中static与private继承关系解析

打印 上一主题 下一主题

主题 1774|帖子 1774|积分 5322

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. static 成员与继承



  • 静态成员属于类本身,而非类的实例。
  • 子类不会继承父类的静态成员,但可以通过父类的作用域访问它们。
  • 静态成员不参与多态,无法通过子类覆盖(override)。
示例:

  1. #include<iostream>
  2. using namespace std;
  3. class Parent {
  4. public:
  5.     static int staticVar;
  6.     static void staticMethod() { cout<<"#################\n"<<endl; }
  7. };
  8. class Child : public Parent {
  9.     // Child 不继承 staticVar 和 staticMethod,但可以直接访问它们
  10. };
  11. int Parent::staticVar = 42;
  12. int main() {
  13.     cout<<"1count():"<<Parent::staticVar<<endl;
  14.     cout<<"1count():"<<Child::staticVar<<endl;
  15.     Child::staticVar = 10;        // 通过子类访问父类静态成员
  16.     cout<<"2count():"<<Parent::staticVar<<endl;
  17.     cout<<"2count():"<<Child::staticVar<<endl;
  18.     Child::staticMethod();       // 通过子类调用父类静态方法
  19.     Parent::staticMethod();      // 直接调用父类静态方法
  20.     Parent::staticVar = 20;      // 直接通过父类访问
  21.     cout<<"3count():"<<Parent::staticVar<<endl;
  22.     cout<<"3count():"<<Child::staticVar<<endl;
  23. }
复制代码
2. private 成员与继承



  • 子类无法直接访问父类的 private 成员(无论继承方式怎样)。
  • 父类的 private 成员仍会存在于子类对象中,但只能通过父类的公有或保护方法间接访问。
示例:

  1. #include<iostream>
  2. using namespace std;
  3. class Parent {
  4. private:
  5.     int privateVar;
  6. protected:
  7.     int protectedVar1;
  8. public:
  9.     int protectedVar;
  10.     void setPrivate(int v) { privateVar = v; } // 间接修改父类 private 成员
  11. };
  12. class Child : public Parent {
  13. public:
  14.     void modify() {
  15.         // privateVar = 10;      // 错误:无法直接访问父类 private 成员
  16.         protectedVar = 20;       // 允许访问父类 protected 成员
  17.         cout<<"&&2 :"<<Childer.protectedVar<<endl;
  18.         setPrivate(30);          // 通过父类公有方法间接修改 private 成员
  19.     }
  20. };
  21. int main() {
  22.     Child Childer;
  23.     cout<<"&&1 :"<<Childer.protectedVar<<endl;
  24.     Childer.modify();
  25.    
  26.     cout<<"&&2 :"<<Childer.protectedVar<<endl;
  27. }
复制代码
3. static + private 的交互



  • 如果父类的静态成员是 private,子类无法直接访问它,必须通过父类的公有/保护接口。
示例:

  1. class Parent {
  2. private:
  3.     static int privateStaticVar;
  4. public:
  5.     static int publicStaticVar;
  6.     static int getPrivateStatic() { return privateStaticVar; }
  7. };
  8. class Child : public Parent {
  9. public:
  10.     void test() {
  11.         // int a = privateStaticVar;  // 错误:无法访问父类 private 静态成员
  12.         int b = publicStaticVar;      // 允许访问父类 public 静态成员
  13.         int c = getPrivateStatic();   // 通过父类接口间接访问
  14.     }
  15. };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表