重载(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;
}
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;
}
重写(重定义)了父类里多个重载中的一个后,其他的同名重载函数会被隐藏 也就是说 重写(重定义)一个 那所有的重载都需要重新重写(重定义)
- 重载(overload)、重写(override)、重定义(redefining)
- C++ 的重载(overload),重写(override), 重定义(redefining/hide)
- C++函数重定义(redefining)、重载(overload)、重写 (override)
- C++类中重载(overload)/覆盖(override)/重定义(redefining)
- Overload(重载)Override(重写)
- C++系列——重载(overload),重写(override),重定义(redefine)
- C++重写(override)、重载(overload)、重定义(redefine)以及虚函数调用机制【个人总结】
- C++中重载(overload)、重写(override,也叫做“覆盖”)和重定义(redefine)的区别?
- 重载(overload),重写(override,也称覆盖), 重定义
- 一张图让你明白C++的重载(overload),重写(override)与重定义(redefine)
- 重载(Overload)与重写(Override)
- Overload(重载)和Override(重写)
- 重载(Overload)与重写(Override)
- Override和Overload(重写和重载)
- C# 重载(overload)与重写(override)
- 重载(overload)重写(override)
- overload重载、override重写
- c++ 重载(overload)、覆盖(override)、重定义(隐藏overwrite)
- 通过Unity引擎可实现小规模的人员开发游戏
- 中国网游用户调查:可玩性高才是王道
- 建立隐藏的超管账户,hideadmin的用法!
- Android本地缓存和远程图片获取的实现
- 【max】数据库密码加密规则
- 重载(overload)、重写(override)、重定义(redefining)
- 多态性
- DataSet方法登录错误3次锁定5分钟源代码
- Tomcat 虚拟主机配置
- jquery右下角弹出提示框
- 配置 vsFTPD 服务
- bad interpreter: No such file or directory
- 向ALEXA提交网站介绍信息
- 整理和吸引