C++ 类中静态成员和静态成员函数的继承覆盖

本文探讨了C++中子类如何继承父类的静态成员和静态成员函数。子类可以访问并修改父类的静态成员,但这种访问并不构成继承关系,而是共享同一内存空间。而静态成员函数则被子类直接继承,但无法实现多态。同时,子类可以通过重新定义静态成员来创建独立的副本,实现与父类静态成员的区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++中子类是否可以继承父类的静态成员和静态成员函数?

静态成员变量

#include <iostream>
using namespace std;
class Base {
public:
    Base(int a) {
        val = a;
        cout << "Base construct fun" << endl;
    }
    static int num;
    int val;
};
int Base::num = 8;
class Son : public Base {
public:
    Son(int a) : Base(a) {//由于父类构造函数立有参数,这里必须采用列表初始化调用基类,构建基类
        cout << "Son construct fun" << endl;
    }
};
int main() {
    Base base(1);
    Son son(2);
    cout << "base val:" << base.val << endl;
    cout << "son val:" << son.val << endl;
    cout << "base num:" << base.num << endl;
    cout << "son num:" << son.num << endl;
    cout << "================" << endl;
    son.num = 9;
    son.val = 3;
    cout << "base val:" << base.val << endl;
    cout << "son val:" << son.val << endl;
    cout << "base num:" << base.num << endl;
    cout << "son num:" << son.num << endl;
    return 0;
}

在这里插入图片描述

从结果来看,子类可以调用父类的静态成员变量,但又和普通的成员变量继承不同的是,我们通过修改子类的静态成员变量的值,父类调用静态成员变量也被修改了。其实该静态成员只有唯一的一个实例
可以看做子类共享父类的静态成员的内存,子类可以修改该内存中的值,因此父类调用时也被修改了。 所以并不能看成继承关系,可以认为是共享关系。

子类是否可以隐藏基类的静态成员呢?

#include <iostream>
using namespace std;
class Base {
public:
    Base(int a) {
        val = a;
        cout << "Base construct fun" << endl;
    }
    static int num;
    int val;
};
int Base::num = 8;
class Son : public Base {
public:
    Son(int a) : Base(a) {//由于父类构造函数立有参数,这里必须采用列表初始化调用基类,构建基类
        cout << "Son construct fun" << endl;
    }
    static int num;
};
int Son::num = 9;
int main() {
    Base base(1);
    Son son(2);
    cout << "base val:" << base.val << endl;
    cout << "son val:" << son.val << endl;
    cout << "base num:" << base.num << endl;
    cout << "son num:" << son.num << endl;
    cout << "================" << endl;
    son.num = 10;
    son.val = 3;
    cout << "base val:" << base.val << endl;
    cout << "son val:" << son.val << endl;
    cout << "base num:" << base.num << endl;
    cout << "son num:" << son.num << endl;
    return 0;
}

在这里插入图片描述

在子类重新定义一个相同的静态成员变量,可以看出,子类和父类的静态成员变量其实是两个不同的东西了(开辟了两块静态变量空间),修改子类并不会修改父类中的值。

静态成员函数

#include <iostream>
using namespace std;
class Base {
public:
    Base(int a) {
        val = a;
        cout << "Base construct fun" << endl;
    }
    static void fun() {
        cout << "Base static fun" << endl;
    }
    int val;
};
class Son : public Base {
public:
    Son(int a) : Base(a) {//由于父类构造函数立有参数,这里必须采用列表初始化调用基类,构建基类
        cout << "Son construct fun" << endl;
    }
   /* static void fun() {
        cout << "Son static fun" << endl;
    }*/
};
int main() {
    Base base(1);
    Son son(2);
    base.fun();
    son.fun();
    return 0;
}

在这里插入图片描述
看起来是子类继承了父类的静态成员函数

#include <iostream>
using namespace std;
class Base {
public:
    Base(int a) {
        val = a;
        cout << "Base construct fun" << endl;
    }
    static void fun() {
        cout << "Base static fun" << endl;
    }
    int val;
};
class Son : public Base {
public:
    Son(int a) : Base(a) {//由于父类构造函数立有参数,这里必须采用列表初始化调用基类,构建基类
        cout << "Son construct fun" << endl;
    }
    static void fun() {
        cout << "Son static fun" << endl;
    }
};
int main() {
    Base base(1);
    Son son(2);
    base.fun();
    son.fun();
    return 0;
}

在这里插入图片描述
隐藏也是可以实现的
多态呢

#include <iostream>
using namespace std;
class Base {
public:
    Base(int a) {
        val = a;
        cout << "Base construct fun" << endl;
    }
    static void fun() {
        cout << "Base static fun" << endl;
    }
    int val;
};
class Son : public Base {
public:
    Son(int a) : Base(a) {//由于父类构造函数立有参数,这里必须采用列表初始化调用基类,构建基类
        cout << "Son construct fun" << endl;
    }
    static void fun() {
        cout << "Son static fun" << endl;
    }
};
int main() {
    Base base(1);
    Son son(2);
    Base* p = new Son(3);
    base.fun();
    son.fun();
    p->fun();
    return 0;
}

在这里插入图片描述
明显多态无法实现(static不可能是虚函数,这个很好理解)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aries_Ro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值