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

1. static 成员与继承

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

using namespace std;


class Parent {
public:
    static int staticVar;
    static void staticMethod() { cout<<"#################\n"<<endl; }
};

class Child : public Parent { 
    // Child 不继承 staticVar 和 staticMethod,但可以直接访问它们
};

int Parent::staticVar = 42;

int main() {
    cout<<"1count():"<<Parent::staticVar<<endl;
    cout<<"1count():"<<Child::staticVar<<endl;
    Child::staticVar = 10;        // 通过子类访问父类静态成员
    cout<<"2count():"<<Parent::staticVar<<endl;
    cout<<"2count():"<<Child::staticVar<<endl;
    Child::staticMethod();       // 通过子类调用父类静态方法
    Parent::staticMethod();      // 直接调用父类静态方法
    Parent::staticVar = 20;      // 直接通过父类访问
    cout<<"3count():"<<Parent::staticVar<<endl;
    cout<<"3count():"<<Child::staticVar<<endl;
}

2. private 成员与继承

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

using namespace std;


class Parent {
private:
    int privateVar;
protected:
    int protectedVar1;
public:
    int protectedVar;
    void setPrivate(int v) { privateVar = v; } // 间接修改父类 private 成员
};

class Child : public Parent {
public:
    void modify() {
        // privateVar = 10;      // 错误:无法直接访问父类 private 成员
        protectedVar = 20;       // 允许访问父类 protected 成员
        cout<<"&&2 :"<<Childer.protectedVar<<endl;
        setPrivate(30);          // 通过父类公有方法间接修改 private 成员
    }
};

int main() {

    Child Childer;

    cout<<"&&1 :"<<Childer.protectedVar<<endl;

    Childer.modify();
    
    cout<<"&&2 :"<<Childer.protectedVar<<endl;
}

3. static + private 的交互

  • 如果父类的静态成员是 private,子类无法直接访问它,必须通过父类的公有/保护接口。
示例:
class Parent {
private:
    static int privateStaticVar;
public:
    static int publicStaticVar;
    static int getPrivateStatic() { return privateStaticVar; }
};

class Child : public Parent {
public:
    void test() {
        // int a = privateStaticVar;  // 错误:无法访问父类 private 静态成员
        int b = publicStaticVar;      // 允许访问父类 public 静态成员
        int c = getPrivateStatic();   // 通过父类接口间接访问
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值