类继承的作用域、函数隐藏、重载函数覆盖
https://www.cnblogs.com/tianzeng/p/9775672.html
一、基类与派生类的作用域关系
1、每个类定义自己的作用域,在这个作用域内我们定义类的成员;
2、派生类的作用域位于基类作用域之内;
二、成员函数调用
1、一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的;即使静态类型与动态类型可能不一致,但我们能使用哪些成员仍然是有静态类型决定的
2、名字冲突与继承:派生类能重用定义在其直接基类或间接基类中的名字,此时定义在内层作用域(即派生类)的名字将隐藏定义在外层作用域(即基类)的名字;
3、通过作用域运算符来使用隐藏的成员:
struct Derived : Base { int get_base_mem(){return Base::mem; } //... };
4、名字查找先于类型检查:
(1)声明在内层作用域的函数并不会重载声明在外层作用域的函数(定义派生类中的函数也不会重载其基类中的成员函数);
(2)如果派生类的成员与基类的某个成员同名,则派生类将在其作用域内隐藏该基类成员;即使派生类成员与基类成员的形参列表不一致,基类成员仍然会被隐藏掉(但是可用基类指针来访问基类被覆盖的函数);
可用override关键字来避免出现派生类重写虚函数时,出现函数参数不一致情况;
7、虚函数与作用域:如果基类与派生类的虚函数接受的实参不同,则无法通过基类指针或引用调用派生类的虚函数;
二、覆盖重载的函数:
1、场景:派生类需要覆盖基类重载函数集合中的部分而非全部函数;
2、说明:
(1)成员函数无论是否是虚函数都能被重载;
(2)派生类可以覆盖重载函数的0个或多个实例(全部覆盖或者一个都不覆盖)
(3)要重载的基类函数在派生类中必须可以访问;
3、实现
(1)using声明语句:{... using Base::fun1 ...}
(2)重新定义重载函数集合中的部分函数,当用派生类调用时,会调用派生中被重写的函数;
(3)对派生类没有重新定义的重载版本函数的访问实际上是对using声明点的访问;