测试环境 VS2012
主要描述下自己工作中容易混淆的点。
const
1 不能只基于返回值是否为const来进行重载,换句话说,重载和返回值无关,即是否重载时不看函数返回值(包括返回值的const和static限定)
因为当调用foo(1)的时候,编译器不知道是不是要把返回值置为const。
2 不能只基于形参列表中的形参是否限定为const进行重载。因为对于foo(1),系统不知道调用形参是否限定了const的函数。
3 可以只基于成员函数是否为const进行重载。
当非const对象调用时,优先调用非const的函数,若只有对应的const函数,则也调用。
而Const对象调用时,只能调用const的函数。
4 const成员只能在初始化列表中初始化。
static
1 不能只基于某函数是不是加static限定来进行重载
2 static成员函数只能直接访问static数据,当然可以通过携带this形参的方式访问其他的。
3 static不单独从属某一个对象,但是又属于任意一个对象(任意对象都可以调用,也可以直接类名::函数调用)
4 static外部使用表明变量本文件起作用(一般定义在源文件)。
重载:
1 同一个类的同名函数
2 形参类型列表不同或者有const函数区分。
3:返回类型是否相同不是必须条件。
覆盖:发生于基类指针(可以)调用子类函数时
1:父子类函数形参类型列表和const限定完全一致(此处的const限定指的是函数是否为const,而形参是否为const则忽略)
2:父类有virtual
3:调用时调用子类的实现
4:函数返回值必须相同,不过形参是否带const则无所谓。
PS:若仅仅子类对应函数返回值不同则编译不通过。而如果是子类和父类const限定不同则可以编译通过但是不是“覆盖”的场景了,此时是“隐藏”的场景
隐藏:基类指针不能调用子类函数
场景1: 父子类形参列表和const限定相同,没有virtual--
场景2: 父子类形参列表和const限定不同,不管有没有virtual
3:返回类型是否相同不是必须条件。
此时,基类指针不能调用子类函数(因为不是覆盖),子类指针或对象也不能调用父类函数(因为父类的被隐藏)
因此如果把同名函数的形参类型列表和const函数限定定义为A的话:
1:同一个类里面A不同的函数之间是重载
2:父子类里面A相同+父类有virtual是覆盖
3:父子类里面A相同+父类无VIRTUAL 或者 父子类的A不同是隐藏。