父类调用子类同名方法_C++知识点 43:继承中同名成员的处理

43.1 同名成员变量的处理
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class Base
{
public:
Base() {
this->m_A = 10;
}
int m_A;
};
class Son :public Base
{
public:
Son() {
this->m_A = 20;
}
int m_A;
};
int main()
{
Son s; // 自己本身有一个 m_A,从父类中又继承了一个 m_A
cout << s.m_A << endl; // 结果: 20
cout << s.Base::m_A << endl; // 结果: 10// 默认使用自己的 // 访问父类中同名的成员, 需要加作用域
}

43.2 同名成员函数的处理
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;

class Base
{
public:
void func() {
cout << "父类中func调用" << endl;
}
};
class Son:public Base
{
public:
void func(){
cout << "子类中func调用" << endl;
}
};
int main()
{
Son s;
s.func();
s.Base::func(); // 需要加作用域 访问父类中同名的成员函数
}

43.3 同名成员函数的处理的本质
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class Base
{
public:
void func() {
cout << "父类中的func调用" << endl;
}
void func(int a) {
cout << "父类中的func(int a)调用" << endl;
}
};
class Son :public Base
{
public:
void func() {
cout << "子类中的func调用" << endl;
}
};

// func() 父子都有 // 是 同名成员函数
// func(int a) 只有父类 // 不是 同名成员函数
int main()
{
// 同名函数 func() 的处理
Son s;
s.func(); // 结果:子类中的func调用
s.Base::func(); // 结果:父类中的func调用
s.Base::func(1); // 结果:父类中的func(int a)调用
}本质:当出现同名函数 func(),编译器为了防止二义性,就已经将父类中的func()及其函数重载都屏蔽掉了
这种方式叫做“ 重定义” ,要与“ 重载” 、 “ 重写” 相区别
因此:提及func()及其函数重载,都认为是子类的!!
所以加作用域调用父类函数, s.Base::func();
注意: func(int a) 虽然不是同名函数,而且fun(1)也不会出现二义性,按理说,可以直接直接调用
但是: 按上述分析, func(1)会认为是子类的,但子类中没有有参构造
写成s.func(1),会出现参数过多的错误提示
解决:访问加作用域

c3777a9a13d22940fb9adcce40f90b74.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值