• 第47课 父子间的冲突


    父子间冲突
    子类中是否可以定义父类中的同名成员?
    如果可以,如何区分?如果不可以,为什么?
    同名成员变量

    #include <iostream>
    
    using namespace std;
    
    class Parent
    {
    public:
        int mi;
    };
    
    class Child : public Parent
    {
    public:
        int mi;
    };
    
    int main()
    {
        Child c;
        c.mi = 100;//mi究竟是自定义的,还是从父类那继承而来的。
        return 0;
    }

    子类可以定义父类中的同名成员
    子类中的同名成员将隐藏父类中的同名成员
    父类中的同名成员依然存在于子类中
    通过作用域分辨符(::)访问父类中的同名成员

    #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 = 100;
        c.Parent::mi = 1000;
    
        cout << "c.mi=" << c.mi << endl;
        cout << "&c.mi=" << &c.mi <<endl;
    
        cout << "c.Parent::mi" << c.Parent::mi << endl;
        cout << "&c.Parent::mi" << &c.Parent::mi << endl;
        return 0;
    }

    再论重载
    类中的成员函数可以进行重载
    1.重载函数的本质为多个不同的函数
    2.函数名和参数列表是唯一的标识
    3.函数重载必须发生在同一个作用域中

    子类中定义的函数是否能重载父类中的同名函数?
    其实将父子间的冲突上升到了函数了,
    父子间的函数重载实验

    #include <iostream>
    
    using namespace std;
    
    class Parent
    {
    public:
        int mi;
        Parent()
        {
    
            cout << "Parent()" << "&mi=" << &mi << endl;
        }
        void add(int v)
        {
            mi +=v;
        }
        void add(int a, int b)
        {
            mi +=(a + b);
        }
    };
    
    class Child : public Parent
    {
    public:
        int mi;
        Child()
        {
            cout << "Child()" << "&mi=" << &mi << endl;
        }
    
    };
    
    int main()
    {
        Child c;
        c.mi = 100;
        c.Parent::mi = 1000;
    
        cout << "c.mi=" << c.mi << endl;
        cout << "c.Parent::mi=" << c.Parent::mi << endl;
    
        c.add(1);
        c.add(3,4);
       
        cout << "c.mi=" << c.mi << endl;
        cout << "c.Parent::mi=" << c.Parent::mi << endl;
        return 0;
    }

    #include <iostream>
    
    using namespace std;
    
    class Parent
    {
    public:
        int mi;
        Parent()
        {
    
            cout << "Parent()" << "&mi=" << &mi << endl;
        }
        void add(int v)
        {
            mi +=v;
        }
        void add(int a, int b)
        {
            mi +=(a + b);
        }
    };
    
    class Child : public Parent
    {
    public:
        int mi;
        Child()
        {
            cout << "Child()" << "&mi=" << &mi << endl;
        }
        void add(int x, int y, int z)
        {
            mi +=(x + y + z);
        }
    
    };
    
    int main()
    {
        Child c;
        c.mi = 100;
        c.Parent::mi = 1000;
    
        cout << "c.mi=" << c.mi << endl;
        cout << "c.Parent::mi=" << c.Parent::mi << endl;
    
        c.add(1);
        c.add(3,4);
        c.add(3,4,5);
        cout << "c.mi=" << c.mi << endl;
        cout << "c.Parent::mi=" << c.Parent::mi << endl;
        return 0;
    }

    原来好好的程序,在子类中定义了一个add函数后,为什么出错了呢?
    子类中的同名成员函数也会去覆盖父类的同名成员函数,也就是在这个地方,子类中定义了add函数后,父类中的add(int)、add(int ,int)这两个函数被隐藏了。无法通过子类对象直接进行调用了。这显然不是重载。从理论上讲,它们的作用域不同。

    需要加上作用域分辨符就可以正常编译通过。即

    c.Parent::add(1);

    c.Parent::add(3,4);

    子类中的同名函数将隐藏父类中的同名函数
    子类无法重载父类中的成员函数
    使用作用域分辨符访问父类中的同名函数
    子类可以定义父类中完全相同的成员函数

  • 相关阅读:
    《Scrum实战》第4次课【全职的Scrum Master】作业汇总
    回顾Scrum学习:《Scrum实战》第4次课【全职的Scrum Master】作业
    孙式无极桩站桩要领--林泰年
    [Android Tips] 29. 如何判断当前编译的是哪个 Flavor ?
    [Jenkins] 解决 Gradle 编译包含 SVG Drawable 出现异常
    [Android Tips] 28. 如何指定运行特定的 Android Instrumentation Test
    [Gradle] 给已存在的 task 添加依赖
    [Gradle] 针对不同的项目类型应用不同的 findbugs 配置
    [Android Tips] 27. 检查 APK 是否可调试
    [Gradle] 如何强制 Gradle 重新下载项目的依赖库
  • 原文地址:https://www.cnblogs.com/-glb/p/11954321.html
Copyright © 2020-2023  润新知