• 第四十七课、父子间的冲突


    一、父子间的冲突

    1、子类可以定义父类中的同名成员变量

    2、子类中的成员将隐藏父类中的同名成员

    3、父类中的同名成员依然存在于子类中

    4、通过作用域分辨符(::)访问父类中的同名成员

    #include<iostream>
    
    using namespace std;
    
    class Parent
    {
    public:
        int mi;
        Parent()
        {
            cout << "&Parent.mi=" << &mi << endl;
        }
    };
    
    class Child : public Parent
    {
    public:
        int mi;
        Child()
        {
            cout << "&Child.mi=" << &mi << endl;
        }
    };
    int main()
    {
        Child c;
        c.mi = 1000;//访问子类的
        c.Parent::mi = 100;//通过作用域分辨符来访问父类中的同名成员变量
        
        cout << endl;
    
        cout <<"&c.mi=" << &c.mi << endl;
        cout << "c.mi=" << c.mi << endl;
    
        cout << endl;
    
        cout << "&c.Parent::mi=" << &c.Parent::mi << endl;
        cout << "c.Parent::mi=" << c.Parent::mi << endl;
        return 0;
    }
    
    //输出结果
    /*
    &Parent.mi=0xbff768d8  //注意是先调用的是父类的构造函数
    &Child.mi=0xbff768dc
    
    &c.mi=0xbff768dc
    c.mi=1000
    
    &c.Parent::mi=0xbff768d8
    c.Parent::mi=100
    */

    二、再论重载

    1、类中的成员函数可以重载

    (1)、重载函数的本质为多个不同的函数

    (2)、函数名参数列表是唯一的标识

    (3)、函数重载必须发生在同一作用域中

    2、父子间的同名函数

    (1)、子类中的函数将隐藏父类中的函数

    (2)、子类无法重载父类中的成员函数

    (3)、使用作用域分辨符访问父类中的同名函数

    (4)、子类可以定义父类中完全相同的函数

    #include<iostream>
    
    using namespace std;
    
    class Parent
    {
    public:
        int mi;
        void add(int v)
        {
            mi += v;
        }
    
        void add(int x, int y)
        {
            mi += (x + y);
        }
    };
    
    class Child : public Parent
    {
    public:
        int mi;
        void add(int v)
        {
            mi += v;
        }
    
        void add(int x, int y, int z)
        {
            mi += (x + y + z);
        }
    
    };
    int main()
    {
        Child c;
        c.mi = 1000;
        c.Parent::mi = 100;
        
        cout << "c.mi = " << c.mi << endl;
        cout << "c.Parent::mi = " << c.Parent::mi << endl;
    
        c.add(1);
        c.Parent::add(1);
        cout << "c.mi = " << c.mi << endl;
        cout << "c.Parent::mi = " << c.Parent::mi << endl;
    
    //    c.add(1, 2);//子类没有这个函数,会编译出错,   子类中只要有一个函数与父类中的函数同名(同名即可),父类中所有同名的函数都会被隐藏起来
        c.Parent::add(1, 2);
        cout << "c.Parent::mi = " << c.Parent::mi << endl;
        return 0;
    }
    
    //输出结果
    /*
    c.mi = 1000
    c.Parent::mi = 100
    c.mi = 1001
    c.Parent::mi = 101
    c.Parent::mi = 104
    */

    三、小结

    1、子类可以定义父类中的同名成员

    2、子类中的成员将隐藏父类中的同名成员

    3、子类和父类中的函数不能构成重载关系

    4、子类可以定义父类中完全相同的成员函数

    5、使用作用域分辨符访问父类中的同名成员

  • 相关阅读:
    正则表达式
    iOS设置图片名称、启动图片、防止TabBar图片和文字渲染
    UIImageView中的UIButton不响应事件解决方案
    iOS 适配https
    【如何快速的开发一个完整的iOS直播app】(美颜篇)
    【如何快速的开发一个完整的iOS直播app】(采集篇)
    【如何快速的开发一个完整的iOS直播app】(播放篇)
    【如何快速的开发一个完整的iOS直播app】(原理篇)
    iOS10字体
    AFN 无网络监控
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6367760.html
Copyright © 2020-2023  润新知