C++零碎记录(十一)

20. 同名静态成员处理

① 静态成员和非静态成员出现同名,处理方式一致:

1. 访问子类同名成员,直接访问
2. 访问父类同名成员,需要加作用域

② 加上static关键字后,成员发生变化,成员变成静态成员。

③ 静态成员变量特点:

1. 所有对象都共享同一份数据。
2. 编译阶段就分配内存。
3. 类内声明,类外初始化。

④ 静态成员函数特点:

1. 只能访问静态成员变量,不能访问非静态成员变量。
2. 所有对象都共享同一份函数实例。
#include <iostream>
using namespace std;

//继承中同名静态成员处理方式
class Base
{
public:
    
    static int m_A;  //静态成员类内声明,类外初始化

    static void func()
    {
        cout << "Base - static func()" << endl;
    }

    static void func(int a)
    {
        cout << "Base - static func(int a)" << endl;
    }
};

int Base::m_A=100;

class Son:public Base
{
public:

    static int m_A;

    static void func()
    {
        cout << "Son - static void func()" << endl;
    }
};

int Son::m_A = 200;

//同名静态成员属性
void test01()
{
    //1、通过对象访问
    Son s;
    cout << "Son 下 m_A = " << s.m_A << endl;
    cout << "Base 下 m_A = " << s.Base::m_A << endl;

    //2、通过类名访问
    cout << "Son 下 m_A = "<< Son::m_A << endl;
    //第一个::代表通过类名方式访问  第二个::代表访问父类作用域
    cout << "Base 下 m_A= "<< Son::Base::m_A << endl;  
}

void test02()
{
    //1、通过对象访问
    Son s;
    s.func();
    s.Base::func();

    //2、通过类名访问
    Son::func();
    Son::Base::func();

    //子类出现和父类同名静态成员函数,也会隐藏掉父类中所有同名成员函数
    //如何想访问父类中被隐藏同名成员,需要加作用域
    Son::Base::func(100);
}

//同名成员函数处理
int main()
{
    test01();
    test02();
    
    system("pause");

    return 0;

}

运行结果:

  • Son 下 m_A = 200
  • Base 下 m_A = 100
  • Son 下 m_A = 200
  • Base 下 m_A= 100
  • Son - static void func()
  • Base - static func()
  • Son - static void func()
  • Base - static func()
  • Base - static func(int a)
  • 请按任意键继续. . .

21. 多继承语法

① C++运行一个类继承多个类。

② 语法:class 子类:继承方式 父类1,继承方式 父类2,.....

③ 多继承可能会引发父类中有同名成员出现,需要加作用域区分。

④ C++实际开发中不建议用多继承。

#include <iostream>
using namespace std;

class Base1
{
public:
    
    Base1()
    {
        m_A = 100;
    }
    
    int m_A;

};

class Base2
{
public:

    Base2()
    {
        m_A = 200;
    }

    int m_A;

};

//子类  需要继承Base1和Base2
//语法:class 子类:继承方式 父类1,继承方式 父类2,.....
class Son:public Base1,public Base2
{
public:

    Son()
    {
        m_C = 300;
        m_D = 400;
    }

    int m_C;
    int m_D;
};

void test01()
{
    Son s;

    cout << "sizeof(Son):" << sizeof(s) << endl;
    //当父类中出现同名成员,需要加作用域区分
    cout << "Base1::m_A = " << s.Base1::m_A << endl;
    cout << "Base2::m_A = " << s.Base2::m_A << endl;

}

int main()
{
    test01();

    system("pause");

    return 0;

}

运行结果:

  • sizeof(Son):16
  • Base1::m_A = 100
  • Base2::m_A = 200
  • 请按任意键继续. . .

链接:https://www.zhihu.com/question/437657370/answer/1692846096

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值