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);

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

  • 相关阅读:
    div+css 遮罩层
    高可用开源方案Heartbeat vs Keepalived
    nginx+keepalive 实现高可用负载均衡方案
    KeepAlive详解
    (转)高可用可伸缩架构实用经验谈 ---- 重要
    OpenStack与KVM的区别与联系
    架构师于小波:魅族实时消息推送架构
    抛开flash,自己开发实现C++ RTMP直播流播放器
    (转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
    (转)OC学习笔记 @property的属性 strong 和 weak 理解
  • 原文地址:https://www.cnblogs.com/-glb/p/11954321.html
Copyright © 2011-2022 走看看