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


一、父子间的冲突

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、使用作用域分辨符访问父类中的同名成员

优质内容筛选与推荐>>
1、C# 面试题
2、[线性筛][中国剩余定理][同余方程] Jzoj P6272 整除
3、java实现 阿拉伯数字转换为汉字数字 算法
4、Go语言结构应用实例
5、校省选赛第一场C题解Practice


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn