zoukankan      html  css  js  c++  java
  • 第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);

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

  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/-glb/p/11954321.html
Copyright © 2011-2022 走看看