C++ - 子类与父类的同名成员变量_c++子类和父类有相同的成员变量

c.mi = 100;    // mi 究竟是子类自定义的,还是从父类继承得到的?

return 0;

}


结果:编译正确,可以通过。


父类和子类是可以存在同名变量的。



**2.父类和子类之间的同名冲突**


-> 子类可以定义父类中的同名成员。


-> 子类中的成员将隐藏父类中的同名成员。


-> 父类中的同名成员依然存在于子类中。


-> 通过作用域分辨符(::)访问父类中的同名成员。



Child c;
c.mi = 100; //子类中的mi
c.Parent::mi = 1000; //父类中的mi


![](https://img-blog.csdnimg.cn/20200909095217399.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BpYW9ndW82MA==,size_16,color_FFFFFF,t_70)


 代码示例:同名变量



#include
#include

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;  
}   //确认成员变量地址,定位类Parent

};

class Child : public Parent
{
public:
int mi;

Child()
{
    cout << "Child() : " << "&mi = " << &mi << endl;
}   //确认成员变量地址,定位类Child

};

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;

}


结果:



Parent() : &mi = 0xbfb99188
Child() : &mi = 0xbfb918c
&c.mi = 0xbfb9918c //证明调用的子类mi
c.mi = 100 //打印子类中的mi
&c.Parent::mi = 0xbfb99188 //证明调用的子类继承自父类的mi
c.Parent::mi = 1000 //打印父类中的mi


分析:


当子类和父类有同名成员时,父类成员被子类覆盖,但是它依然存在子类中。


子类中的mi和父类中mi地址相差4,父类Parent只有int类型mi,类Parent占用4字节,子类Child也只有同名int类型mi,占用4字节。在栈上分配内存时,会被连续分配。


类的大小并不包含成员函数的大小。



**3.父类和子类之间的重载**


**类中的成员函数可以进行重载:**


-> 重载函数的本质为多个不同的函数。


-> 函数名和参数列表是唯一的标识。


-> 函数重载必须发生在同一个作用域中。



#include
#include

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

int main()
{
Child c;

c.mi = 100;    //访问子类的mi

c.Parent::mi = 1000;    //访问子类继承父类的mi

cout << "c.mi = " << c.mi << endl;

cout << "c.Parent::mi = " << c.Parent::mi << endl;

c.add(1);
c.add(2, 3);

cout << "c.mi = " << c.mi << endl;

cout << "c.Parent::mi = " << c.Parent::mi << endl;

return 0;

}


结果:



c.mi = 100 //打印子类mi数值
c.Parent::mi = 1000 //打印继承自父类的mi数值
c.mi = 100 //打印子类mi值
c.Parent::mi = 1006 //打印继承自父类的mi值


分析:


c.Parent::mi = 1006因为子类没有任何成员函数,调用c.add(1)和c.add(2,3)时,执行的是继承自父类的add()函数。因此打印1006。



**在子类Child重写累加函数:**



#include
#include

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;    //访问子类的mi

c.Parent::mi = 1000;    //访问子类继承父类的mi

cout << "c.mi = " << c.mi << endl;

cout << "c.Parent::mi = " << c.Parent::mi << endl;

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;

}


结果:编译错误



47-3.cpp: In function ‘int main()’:
47-3.cpp:57:9: error: no matching function for call to ‘Child::add(int)’
c.add(1);
^
错误:没有匹配’Child::add(int)'函数
c.add(1);
47-3.cpp:57:9: note: candidate is:
47-3.cpp:37:7: note: void Child::add(int, int, int)
void add(int x, int y, int z)
^
47-3.cpp:37:7: note: candidate expects 3 arguments, 1 provided

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

gmRh3NH-1715541951542)]

[外链图片转存中…(img-nyiXqNCg-1715541951542)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值