一、override和overload区别
当需要一些相同的函数名接受不同的参数实现不同的功能时,可以是运用函数重载来实现。但是,函数的重载必须要在同一个作用域内重载,才叫做重载。在不同作用域的两个同名函数,并没有太大的关联。
函数重载容易与函数重写(override)混淆,比如派生类中有一个与基类同名的函数,并且函数名,返回值,参数列表均相同,但是这并不叫做重载,首先它们不在同一作用域,其次就算是重载参数列表也应该不同。所以这种派生类的行为称作对基类函数的重写(override)。
二、函数重载(function overload)
1、函数名和返回值相同,参数列不同的函数才能被重载。
2、C++是无法重载仅以返回值类型来区分的函数的。
3、但是在类中,const成员函数和非const成员函数是被看做同名函数的两个重载版本的。
三、运算符重载(operator overload)
运算符重载与函数重载书写格式基本一样只是把函数名换成 operator某某运算符
而已。
但是要注意几个只能在类中重载的运算符:
1、下标运算符[]
2、函数调用运算符() 与函数对象有关
3、指针成员运算符->
4、复制运算符=
注意上面的运算符重载和函数重载都是编译时的多态(也叫做静态绑定,早绑定),即在程序编译时就确定好了的函数,编译时就可以确定之后的函数调用是使用的哪个函数。而运行时的多态主要是依靠类继承和虚函数来实现的。
四、函数的重写(override)
即在派生类当中对基类的虚函数进行了重新定义,执行不同的方法。
重写的要点:
1、返回值,函数名,参数都应该相同。
2、函数体类的定义不同
3、作用域不同,一个在基类,一个在派生类。
3、该函数必须是基类的virtual函数。(不是vrtual函数,那就是覆盖)。
五、类中的覆盖(hide)
派生类会继承(这里仅考虑public继承)基类的所有成员。如果一个函数在基类中有多个重载版本,但派生类重写了其中的一个重载版本,那么从基类继承而来的所有其他同名函数都将被覆盖,在派生类中只有这一个被重写的具备该名称的函数。
基类和派生类:
class Base {
public:
const int test_override() {
cout << 10 << endl;
return 10;
}
static int test_override(int a, int b) {
cout << a << b << endl;
}
int test_override(int a, int b, int c) {
cout << a << b << c << endl;
}
virtual int test_override(int a) {
cout << a << endl;
return a;
}
};
class Derived :public Base{
public:
int test_override() {
cout << 10 << endl;
return 10;
}
};
此种情况,派生类重载的int test_override()
函数将覆盖基类的所有同名版本(包括基类的虚函数)。
测试代码:
int main() {
Derived d;
d.test_override();
包括虚函数,static静态函数,普通成员函数
return 0;
}
但如果,将派生类重写的函数原型改为和基类的虚函数一样,那么就相当于在派生类中重写了虚函数,修改了虚函数表,实现了多态。但是其他版本自基类继承而来的同名函数同样会被覆盖。(除非在派生类中再次声明定义)。
总结:只要派生类对基类的函数进行重写,就会覆盖掉自基类继承而来的其他所有同名函数,除非使用基类的作用域运算符,即Base::
。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)