继承中的名字隐藏
1.基类同名函数被隐藏
对于下面的代码
class P
{
public:
void f() {}
};
class C :public P
{
public:
void f(int x) {}
};
int main()
{
C c;
c.f();
}
g++编译结果:
NameHiding.cpp:13:7: error: no matching function for call to 'C::f()'
(Visual C++编译结果:应该也是错的)
这就是子类的同名函数隐藏了父类的同名函数(只同名就可以)
1.1. 内部作用域的名字隐藏外部作用域的(同名)名字)
(1) 派生类视作内部作用域
(2) 基类视作外部作用域
2. Why?
(1) 避免某些潜在的危险行为
(2) 每个类在创建时,它的函数名都是写在一张干净的白纸上面,不会被基类函数名干扰
重定义函数
1. 重定义函数
子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 重定义后子类调用的函数是子类自己的函数,父类的函数会被隐藏。名字隐藏特性。如果想调用父类的该同名函数,需要用父类加上作用域来指定调用的函数。
扫描二维码关注公众号,回复:
6785855 查看本文章
2. Redefine (重定义)
3. 重定义与重载
3.1. 重载函数
3.1.1. 多个函数名字相同
3.1.2. 但至少一个特征不同
(1) 参数类型
(2)参数数量
(3) 参数顺序
3.2. 重定义函数
3.2.1.函数特征相同
(1) 同名)
(2) 同参数:类型,数量和顺序
(3) 返回值类型
3.2.2. 在基类和派生类中分别定义
虽然与上面重复,但还是总结如下为好:
函数重载:
必须在一个类中进行(子类无法重载父类中的函数)
子类无法重载父类的函数,父类同名函数将被子类的同名函数覆盖
重载是在编译期间根据参数类型,顺序,个数决定的函数调用
函数重写
必须发生于父类和子类之间
并且父类和子类中的函数必须有完全相同的函数签名
使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
多态是在运行期间根据具体对象的类型决定函数调用
重写的同时一般会伴随发生函数重定义
函数重定义
必须发生于父类和子类之间
重定义不一定是多态