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

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不可能是虚函数,这个很好理解)

  • 17
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Aries_Ro

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

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

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

打赏作者

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

抵扣说明:

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

余额充值