C++第47课--父子间的冲突,父子间成员的同名覆盖

本文学习自 狄泰软件学院 唐佐林老师的 C++课程


实验1:在子类中定义父类的同名成员 现象
实验2:在子类中定义父类的同名成员
实验3:父子间的同名函数可以重载? 不能
实验4:子类的同名成员函数已经覆盖了父类的同名函数,不能直接调用父类同名函数,需要用作用域分辨符来调用父类成员函数


在这里插入图片描述

实验1:在子类中定义父类的同名成员 现象

#include <iostream>
#include <string>

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

编译没问题!!!

在这里插入图片描述
在这里插入图片描述
实验2:在子类中定义父类的同名成员

#include <iostream>
#include <string>

using namespace std;

namespace A
{
    int g_i = 0;
}

namespace B
{
    int g_i = 1;
}

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

	
mhr@ubuntu:~/work/c++$ 
mhr@ubuntu:~/work/c++$ g++ 47-2.cpp 
mhr@ubuntu:~/work/c++$ ./a.out 
Parent() : &mi = 0x7fff7a5d6c40
Child() : &mi = 0x7fff7a5d6c44
&c.mi = 0x7fff7a5d6c44
c.mi = 100
&c.Parent::mi = 0x7fff7a5d6c40
c.Parent::mi = 1000
mhr@ubuntu:~/work/c++$ 

在这里插入图片描述

在这里插入图片描述

实验3:父子间的同名函数可以重载? 不能

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    int mi;
    
    void add(int v)
    {
        mi += v;
    }
    
    void add(int a, int b)
    {
        mi += (a + b);
    }
};

class Child : public Parent
{
public:
    int mi;
    void add(int v)
    {
        mi += v;
    }
    
    void add(int a, int b)
    {
        mi += (a + b);
    }
    
    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.Parent::add(1);
    c.Parent::add(2, 3);

	//调用子类的成员函数,改变的是子类的成员变量
    c.add(1);
    c.add(2, 3);
    c.add(4, 5, 6);
    
    cout << "c.mi = " << c.mi << endl;
    
    cout << "c.Parent::mi = " << c.Parent::mi << endl;
    
    return 0;
}


mhr@ubuntu:~/work/c++$ g++ 47-3.cpp
mhr@ubuntu:~/work/c++$ ./a.out 
c.mi = 100
c.Parent::mi = 1000
c.mi = 106
c.Parent::mi = 1006
mhr@ubuntu:~/work/c++$ 

实验4:子类的同名成员函数已经覆盖了父类的同名函数,不能直接调用父类同名函数,需要用作用域分辨符来调用父类成员函数

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    int mi;
    
    void add(int v)
    {
        mi += v;
    }
    
    void add(int a, int b)
    {
        mi += (a + b);
    }
};

class Child : public Parent
{
public:
    int mi;
    
    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.Parent::add(1);
    c.Parent::add(2, 3);

   //error 报错! 子类的同名成员函数已经覆盖了父类的同名函数,不能直接调用父类同名函数,需要用作用域分辨符来调用父类成员函数
    c.add(1);
    c.add(2, 3);

   //调用子类的成员函数,改变的是子类的成员变量
    c.add(4, 5, 6);
   
    return 0;
}

在这里插入图片描述

在这里插入图片描述

父子类的同名成员不在一个作用域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值