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](https://i-blog.csdnimg.cn/blog_migrate/1d14cd508a37635012ba53e97ccce732.jpeg)