重载重写重定义-易混淆概念-C++编译器处理方式
2024-10-13 12:21:03
1、函数重载
1)必须在同一个类中进行。
2)子类无法重载父类的函数,父类同名函数将被名称覆盖
3)重载是在编译期间根据参数类型和个数决定函数调用
2、函数重写
1)必须发生于父类与子类之间
2)并且父类与子类中的函数必须有完全相同的原型
3)使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
4)多态是在运行期间根据具体对象的类型决定函数调用
demo
#include <iostream> using namespace std; //重写 重载 重定义 //重写发生在2个类之间 //重载必须在一个类之间 //重写分为2类 //1 虚函数重写 将发生多态 //2 非虚函数重写 (重定义) class Parent { //这个三个函数func都是重载关系 public: virtual void func() { cout << "func() do..." << endl; } virtual void func(int i) { cout << "func() do..." << i << endl; } virtual void func(int i, int j) { cout << "func() do..." << i << " " << j << endl; } virtual void func(int i, int j, int m, int n) { cout << "func() do..." << i << " " << j << endl; } void abc() { printf("abc"); } protected: private: }; class Child : public Parent { public: virtual void func(int i, int j) { cout << "func(int i, int j) do..." << i << " " << j << endl; } virtual void func(int i, int j, int k) { cout << "func(int i, int j) do.." << endl; } void abc() { printf("child abc"); } /* void abc(int a) { printf("child abc"); } */ protected: private: }; //重载重写和重定义 int main() { //: error C2661: “Child::func”: 没有重载函数接受 0 个参数 Child c1; //c1.func(); //子类无法重载父类的函数,父类同名函数将被名称覆盖 c1.Parent::func(); //1 C++编译器看到func名字,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数 //2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的. //3 C++编译器开始报错..... error C2661: “Child::func”: 没有重载函数接受 4 个参数 //4 若想调用父类的func,只能加上父类的域名..这样去调用.. c1.func(1, 3, 4, 5); //c1.func(); //func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置 //因为子类中已经有了func名字的重载形式。 //编译器开始在子类中找func函数。。。。但是没有0个参数的func函数 return 0; }
最新文章
- css3 transfrom变换
- mysql 任意连接
- Python的高级Git库 Gittle
- 杭电ACM2085--核反应堆
- 版本控制工具git入门
- Win32串口API
- js移动端横竖屏检测
- 从头到尾彻底解析Hash 表算法
- 通过JS动态的修改HTML元素的样式和增添标签元素等
- dbus-launch
- spring Boot异步操作报错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type &#39;com.self.spring.springboot.Jeep&#39; available
- Tensorflow图像处理以及数据读取
- Linux下安装GEOS环境
- unity UGUI UI跟随
- Sort Array By Parity II LT922
- Linux命令一览
- CAP定理为什么只能同时满足两个
- ImageView和onTouchListener实现,点击查看图片细节
- linux常用命令全拼
- C语言的参数传递