C++中发生继承时,常常或伴随着子类和父类之间函数或是数据成员的复制、重定义、重写;或是在本类中发生重载;
复制
当发生继承时,子类将会 复制父类 的全部成员;因此我们可以认为在子类中存在两个域:子类域、父类域;
重载(overload)
包括函数重载、运算符重载
特性
-
函数处在相同的范围(即在同一个作用域中)
-
返回值类型可同可不同,函数名字必须相同,参数列表(函数特征:参数类型、个数、顺序)必须不同,同时在函数末尾加上const修饰关键字同样可以构成函数的重载;
-
virtual 关键字可有可无
重定义(redefine)又叫隐藏,遮掩
隐藏是指派生类的函数屏蔽了与其同名的基类函数。注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏,而不是在派生类中发生重载。
特性
-
不在同一个作用域(分别位于派生类与基类)
-
函数名字相同
-
返回值可以不同
-
参数不同,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)
-
参数相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
重写(override)又叫覆盖、覆写
特性
-
不在同一个作用域(分别位于派生类与基类)
-
函数名字相同,参数列表相同,返回值相同(或是协变)。也即派生类的方法应与原来的函数完全相同(除了函数体中的内容);
-
基类函数必须有 virtual 关键字,不能有 static,大概是多态的原因吧...
-
重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中仍然可重写为 public,protected
在函数被virtual修饰的情况下,且父子类被virtual修饰的成员函数类型必须一摸一样,即参数列表和返回类型都必须一致(返回类型允许协变)。子类对象调用时,会直接调用子类域中的成员函数,父类域中的该同名成员就像不存在一样,(可以显示调用)即父类该成员被子类成员覆盖。这个就是我们说的发生多态来根据对象的类型决定调用的成员;但存在一种例外:就是 如果返回类型是 基类的引用或是指针,则可以修改为指向派生类的引用或是指针,这种允许返回类型随类类型的变化而变化的特性称为返回类型协变。
总结