博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习函数的重载与覆盖
阅读量:6123 次
发布时间:2019-06-21

本文共 2648 字,大约阅读时间需要 8 分钟。

虚函数:

  • 覆盖的条件:同名 && 同参 && 同返回值 && 同const类型
  • 重载的条件:同名 && (不同参 || 不同const类型)
  • 非法的条件:同名 && 同参 && 不同返回值类型

非虚函数:

  • 覆盖的条件:同名
  • 重载的条件:不能重载基类的函数,一旦同名,就会覆盖基类的函数,但是可以平级重载

注意:覆盖只能发生在继承过程中,不是继承不能覆盖,出现非法重定义的错误。

代码:

1 #include 
2 3 /*** 4 * @author:zanzan101 5 */ 6 7 class A 8 { 9 public:10 // 虚函数11 virtual void foo1() {printf("A:foo1\n");}12 virtual void foo2() {printf("A:foo2\n");}13 virtual void foo3() {printf("A:foo3\n");}14 virtual void foo4() {printf("A:foo4\n");}15 16 // 非虚函数17 void fun1(){printf("A:fun1\n");}18 void fun2(){printf("A:fun2\n");}19 void fun3(){printf("A:fun3\n");}20 void fun4(){printf("A:fun4\n");}21 void fun5(){printf("A:fun5\n");}22 };23 class B : public A24 {25 public:26 // 虚函数27 void foo1(){printf("B:foo1\n");}28 void foo2(int){printf("B:foo2\n");}29 // int foo3(){printf("B:foo3\n"); return 0;} 非法!error C2555: “B::foo3”: 重写虚函数返回类型有差异,且不是来自“A::foo3”的协变30 void foo4() const {printf("B:foo4\n");}31 32 // 非虚函数33 void fun1(){printf("B:fun1\n");}34 void fun2(int){printf("B:fun2\n");}35 int fun3(){printf("B:fun3\n");return 0;}36 void fun4() const {printf("B:fun4\n");}37 38 void func(){printf("B:func()\n");}39 // void func(){} // 不能覆盖,非法重定义!40 void func(int){printf("B:func(int)\n");}41 void func(double){printf("B:func(double)\n");}42 void func() const{printf("B:func() const\n");}43 };44 45 46 int _tmain(int argc, _TCHAR* argv[])47 {48 A* p = new B();49 50 printf(">> 同名同参同返回值:\n");51 p->foo1();52 53 printf(">> 同名不同参同返回值:\n");54 p->foo2();55 // p->foo2(1); 非法!56 57 // printf(">> 同名同参不同返回值:\n");58 // p->foo3(); 非法!59 60 printf(">> 同名同参同返回值,加const:\n");61 p->foo4();62 63 B* q = new B();64 printf(">> 同名同参同返回值:\n");65 q->fun1();66 67 printf(">> 同名不同参同返回值:\n");68 // q->fun2(); 非法!69 q->fun2(1);70 71 printf(">> 同名同参不同返回值:\n");72 q->fun3();73 74 printf(">> 同名同参同返回值,加const:\n");75 q->fun4();76 77 printf(">> 不同名:\n");78 q->fun5();79 80 printf(">> 同域的重载:\n");81 q->func(); // 参数重载82 q->func(1); // 参数重载83 q->func(1.0); // 参数重载84 ((const B*)q)->func(); // const重载85 // ((const B*)q)->func(1); // 非法!86 87 system("pause");88 return 0;89 }

输出结果:

>> 同名同参同返回值:B:foo1>> 同名不同参同返回值:A:foo2>> 同名同参同返回值,加const:A:foo4>> 同名同参同返回值:B:fun1>> 同名不同参同返回值:B:fun2>> 同名同参不同返回值:B:fun3>> 同名同参同返回值,加const:B:fun4>> 不同名:A:fun5>> 同域的重载:B:func()B:func(int)B:func(double)B:func() const请按任意键继续. . .

 

转载于:https://www.cnblogs.com/zanzan101/p/3405000.html

你可能感兴趣的文章
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
JAVA数组的定义及用法
查看>>
充分利用HTML标签元素 – 简单的xtyle前端框架
查看>>
设计模式(十一):FACADE外观模式 -- 结构型模式
查看>>