1、重载与重写之间没有任何关系。
2、当同一个作用域内的两个或更多个函数名字相同但签名不同时,就会发生重载。
函数的签名由它所声明的参数(或形参)的数目和类型构成。
当编译器在一个作用域内查找一个函数名字时,发现不止一个函数具有该名字,它就会在该作用域内的可用候选函数中,选择其形参与函数调用中的实参有着最佳匹配的那一个函数,此为重载。
3、当派生类函数和基类虚函数具有相同的名字和签名时,就会发生重写。
在这种情况下,派生类函数的实现将会取代它所继承的基类函数的实现,以便满足对派生对象的虚拟调用。
重写机制改变类的行为而不改变其接口。
考虑如下简单的基类:
class B {
public:
//.....
virtual int f( int ); //、、、
void f( B* ); //、、、
//.....
};
名字f在类B中被重载了,因为在同一个作用域内存在两个名字为f的不同函数。
加、的两行是糟糕的代码。原因有二:
也许并不希望重载一个虚函数,或者也可能并不希望在整型和指针类型之间进行重载。
class D : public B {
publilc:
int f ( int );
int f ( B * );
};
成员函数D::f(int)重写了基类中的虚函数B::f(int)。成员函数D::f(B*)没有重写任何东西,因为B::f(B*)不是虚拟的。
然而,它重载了D::f(int)。
注意,它并不重载基类成员B::f,因为他们位于不同的作用域。