重载(overload)、重写(override)、重定义(redefining)

来源:互联网 发布:淘宝天猫店铺怎么开 编辑:程序博客网 时间:2024/09/21 08:57
重载(overload):一个类中,两个名字相同,参数不同的相似函数

重写与重定义的区分:
对父类中的一个函数,在子类中重新实现该函数时
1. 如果父类中该函数声明为virtual即虚函数,则为重写。通过指向子类的父类指针调用该函数时会动态地找到子类重写后该函数调用
2. 如果父类中该函数未被声明为virtual即是非虚函数,则为重定义。通过指向子类的父类指针调用该函数时只会调用与指针类型相关的父类中的该函数

重写(override):子类中对父类中函数相同名称(可以不同参数)的重写(有动态绑定的特性,也即如果父类指针指向了一个子类,通过该指针调用该函数时会动态调用子类重写了的方法)
重定义(redifining):子类中重新定义父类中相同名称(可以不同参数)的非虚函数(没有动态绑定的特性,即使父类指针指向了一个子类,通过该指针调用该方法时也只是父类未被重定义的方法)

重写:
父类与子类间的多态性

被重写的函数 访问级别可以扩大,但不能缩小
比如private的被重写为public、protected可以
但public、protected被重写为private则不可以(因为可能会通过父类的指针来访问这个虚函数)

只有虚函数可以被重写,而非虚函数只能被重新定义(这时 通过父类指针访问时因没有动态绑定只会访问父类中定义的函数 而不能访问到子类中的该函数)

#include<iostream>
using namespace std;
/*分析: 
用一个父类的指针指向一个子类的对象后 
通过这个指针调用一个子类重写过的虚函数时,会动态调用子类的重写过的函数
而通过这个指针调用一个子类重定义过的非虚函数,不会动态调用子类里的重定义过的函数
     而只是调用指针类型对应的父类的该同名函数 
*/ 
/*输出: 
pF->v();
this is Son::v() and i'm override
pF->uv();
this is Father::uv()
???????. . .
*/
struct Father{
     Father(){
     }
     void virtual v(){
          cout<<"this is Father::v():"<<endl;
     }
     void uv(){
          cout<<"this is Father::uv()"<<endl;
     }
};
struct Son: public Father{
     Son(){
     }
     void v(){//重写 
          cout<<"this is Son::v() and i'm override"<<endl;
     }
     void uv(){//重定义 
          cout<<"this is Son::uv() and i'm redifining."<<endl;
     }
};
int main(){
     Father *pF = new Son;//一个指向子类的父类指针
     cout<<"pF->v();"<<endl;
     pF->v(); 
     cout<<"pF->uv();"<<endl;
     pF->uv();
     return 0;
}



重写(重定义)了父类里多个重载中的一个后,其他的同名重载函数会被隐藏 也就是说 重写(重定义)一个 那所有的重载都需要重新重写(重定义)