C++Note 同名静态成员处理 继承语法

复制代码
 1 class Base
 2 {
 3 public:
 4     static int m_A;// 静态成员 类名声明 类外初始化
 5 };
 6 int Base::m_A = 100;
 7 class Son :public Base
 8 {
 9 public:
10     static int m_A;
11 };
12 int Son::m_A = 200;
13 //同名静态成员属性
14 void test()
15 {
16     //1.通过对象访问
17     cout << "通过对象的访问" << endl;
18     Son s;
19     cout << " Son  m_A = " << s.m_A << endl;
20     cout << " Base  m_A = " << s.Base::m_A << endl;
21     //2.通过类名访问
22     cout << "通过类名的访问" << endl;
23     cout << " Son  m_A = " << Son::m_A << endl;
24     cout << " Base  m_A = " << Base::m_A << endl;
25     cout << " 通过Son继承Base  m_A = " << Son::Base::m_A << endl;
26     //第一个::代表类名访问  第二个::代表访问父类作用域下
27 }
复制代码

函数访问

复制代码
//继承中同名静态函数
class Base
{
public:
    static void func()
    {
        cout << "Base - static void func()" << endl;
    }
    static void func(int a)
    {
        cout << "Son - static void func(int a)" << endl;
    }
};
class Son :public Base
{
public:
    static void func()
    {
        cout << "Son - static void func()" << endl;
    }
    
};

void  test1()
{
    //通过对象访问
    cout << "通过对象访问" << endl;
    Son s;
    s.func();
    s.Base::func();
    //通过类名访问
    cout << "通过类名访问" << endl;
    Son::func();
    Son::Base::func();
    //Son::func(100);//错误 函数因为同名被隐藏
    Son::Base::func(110);//正确 需要加作用域继承
}
复制代码

C++允许一个类继承多个类

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

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

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

复制代码
 1 class Base1
 2 {
 3 public:
 4     Base1()
 5     {
 6         m_A = 100;
 7     }
 8     int m_A;
 9 };
10 class Base2
11 {
12 public:
13     Base2()
14     {
15         m_A = 100;
16     }
17     int m_A;
18 };
19 //子类继承Base1和Base2
20 //语法:class 子类:继承方式 父类1,继承方式 父类2...
21 class Son :public Base1,public Base2
22 {  
23 public:
24     Son()
25     {
26         m_C = 300;
27         m_D = 400;
28     }
29     int m_C;
30     int m_D;
31 };
32 void test()
33 {
34     Son s;
35     cout << "sizeof = " << sizeof(s) <<endl;//16 自身两个整型 继承 1 2 共4个整型
36     //当父类中出现同名成员,需要加作用域区分
37     cout << "Base1::m_A = " << s.Base1::m_A << endl;
38     cout << "Base2::m_A = " << s.Base2::m_A << endl;
39 }
复制代码

 

posted on   廿陆  阅读(4)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示