本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结
父子间的冲突
子类 可以定义 父类中的 同名成员
子类中的成员将 隐藏父类 中的同名成员
父类中的 同名成员依然存在于子类中
通过 作用域分辨符 (::) 访问父类中的同名成员
访问父类中的同名成员

实验代码
#include <iostream>
using namespace std;
class Parent
{
public:
int m_i;
public:
Parent()
{
cout << "Parent &m_i: " << &m_i << endl;
}
};
class Child : public Parent
{
public:
int m_i;
public:
Child()
{
cout << "Child &m_i: " << &m_i << endl;
}
};
int main()
{
Child c;
c.m_i = 200;
cout << "&c.m_i = " << &c.m_i << endl;
return 0;
}
运行结果

实验结果:父类和子类都有成员变量 m_i时,c.m_i 调用的是子类的 m_i 成员变量。
若我们想要调用父类的 m_i 变量,更改代码如下:

运行结果

再论重载
类中的成员函数可以进行重载
1.重载函数的 本质为多个不同的函数
2.函数名 和 参数列表 是唯一的标识
3.函数重载 必须发生在同一个作用域中
实验编程
编写一个程序来测试类之间的函数重载
#include <iostream>
using namespace std;
class Parent
{
public:
int m_i;
public:
Parent()
{
cout << "Parent &m_i: " << &m_i << endl;
}
void func(int i)
{
m_i = i;
}
void func(int i, int j)
{
m_i = i + j;
}
};
class Child : public Parent
{
public:
int m_i;
public:
Child()
{
cout << "Child &m_i: " << &m_i << endl;
}
void func(int i, int j, int m)
{
m_i = i + j + m;
}
};
int main()
{
Child c;
c.m_i = 10;
c.func(10);
c.func(10, 20);
c.func(10, 20, 30);
cout << c.m_i << endl;
return 0;
}
编译结果

实验结果:编译报错。 第48行 和 第 49行 报错,child类中找不到匹配的 func函数。说明child类中的成员函数无法重载parent类中的成员函数,重载必须发生在同一个作用域内。child类中的func成员函数对parent类中的func成员函数进行了同名覆盖。
下面,我们改写程序来显示调用parent类中的func函数

编译成功,运行结果

实验结果说明
1.子类中的函数将 隐藏父类的同名函数
2.子类 无法重载 父类中的成员函数
3.使用 作用域分辨符 访问父类中的同名函数
4.子类可以定义父类中 完全相同的成员函数
小结
子类 可以定义 父类中的 同名成员
子类中的成员将 隐藏父类中的同名成员
子类和父类中的函数 不能构成重载关系
子类可以定义父类中 完全相同的成员函数
使用 作用域分辨 符访问父类中的同名成员
本文深入探讨了C++中子类与父类成员变量冲突的现象,包括子类如何隐藏父类成员,如何通过作用域分辨符访问父类成员,以及子类与父类成员函数重载的误区。通过实验代码,清晰展示了子类成员函数对父类同名函数的覆盖而非重载。
146

被折叠的 条评论
为什么被折叠?



