重载和重写

重载是指在同一作用域内的几个函数名字相同但形参列表不同,称这些函数为重载函数.
重写(override)是指子类中对父类的虚函数不继承其实现,而重新实现.

两个除了返回类型外其他所有要素都相同的函数不是重载函数.
顶层const不影响形参的类型.

1
2
Record lookup(Phone);		
Record lookup(const Phone); //重复声明了Record lookup(Phone)

但底层const可以区分两个函数.即如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载.

1
2
Record lookup(Account&);			// 函数作用于Account的引用
Record lookup(const Account&); // 新函数,作用于常量引用

编译器可以通过实参是否是常量来推断应该调用哪个函数.因为const不能转换成其他类型,所以我们只能把const对象(指向const对象的指针)传递给const形参.但是非常量对象可以转换成const,所以上面两个函数都可以作用于非常量对象,但是当实参是非常量对象时,编译器会优先选择非常量版本的函数.

重写(override)是指子类中对父类的虚函数不继承其实现,而重新实现.

const_cast和重载

1
2
3
4
5
6
7
8
const string &shorterString2(const string &s1, const string &s2) {
return s1.size() < s2.size() ? s1 : s2;
}

string &shorterString2(string &s1, string &s2) {
auto &r = shorterString2(static_cast<const string &>(s1), static_cast<const string &>(s2));
return const_cast<string &>(r);
}