C++中概念区分:Overload, Override, Hide

2014-11-24 02:46:53 · 作者: · 浏览: 2

1.
区分:overload, override, Hide


Overload: 重载,指函数同名,但是参数个数不同、或者参数类型不同的多个实现。(如果参数相同但是仅仅返回值不同不是重载,编译器会报错。)
编译器判断重载函数:
第一步,是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。
第二步,分为两动作:第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同,或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值;第二个动作是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。
第三步,从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。
Override:(想不到比较贴切的翻译)指在继承时,父类函数声明为vitual, 子类重新声明和实现该函数(函数名和参数完全相同,返回值不做约束)。子类该函数可以声明为virtual,也可以不加,不做限制,但是如果该子类还会继续被重载,则最好也声明为virtual。
Hide:继承结构中的函数隐藏,指父类中声明了函数,子类中声明和定义了完全一致的函数,但是父类中函数没有声明为virtual,此时子类中的同名同参数函数会完全隐藏父类的函数。貌似和Override很像,但是其实现机制和Override完全不同,且会导致问题,应该避免使用。( virtual机制是使用虚表(vtable)实现的,虚表维护一个虚函数指针列表,但一个对象的某个虚函数被调用的时候,去虚表中查找并决定调用的是哪个函数,具体的实现,可以单独一期博客讲解。)
class Super{public: void go() { cout << "go() called on Super" << endl; }};
class Sub : public Super{public: void go() { cout << "go() called on Sub" << endl; }};

Sub mySub;mySub.go(); // output: go() called on Sub
Super& ref = mySub;ref.go(); //output: go() called on Super

也许你希望它会调用子类的函数,但这可能和你的预期完全不同。