类继承的作用域、函数隐藏、重载函数覆盖

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声明点的访问;

posted @ 2020-09-04 23:24  kuaqi  阅读(163)  评论(0编辑  收藏  举报