免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 21044 | 回复: 39
打印 上一主题 下一主题

[C++] 堆栈是个什么鬼东西? 重载呢? [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-21 15:54 |只看该作者 |倒序浏览
heap —— 堆
stack —— 栈

堆栈是个什么鬼东西?


overload —— 重载
override —— 覆盖
hide —— 隐藏
replace —— 替换

是哪从半调子开始把上面的东西统统叫做重载的?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2010-10-21 16:23 |只看该作者
本帖最后由 OwnWaterloo 于 2010-10-21 16:39 编辑

区别:

1. replace

C++提供默认的 void* operator new (size_t s);
写了一个自己的版本, 这叫replace

2. overload

  1. int max(int a, int b);
  2. double max(double a, double b);
复制代码
具有相同的名字, 但参数不同的函数之间互为overloaded

根据调用处的实际参数, 决定实际调用的函数:

  1. max(1212, 326);   // int max(int,int);
  2. max(12.12, 3.26); // double max(double, double);
复制代码
3. hide

上述"相同名字"有一个前提: 在一个查找的作用域内。

  1. namespace base
  2. {
  3.       int max(int a, int b);
  4. }

  5. namespace derived
  6. {
  7.       double max(double a, double b);
  8. }

  9. void test1()
  10. {
  11.       using base::max;
  12.       max(12.12, 3.26); // int max(int, int);
  13. // 在这个作用域里只有一个max
  14. // 就是int max(int, int);
  15. // 即使调用的实际参数是 double, double, 也只能选中这个(通过double->int的转换)
  16. // 不会选到derived::max
  17. }

  18. void test2()
  19. {
  20.       using derived::max;
  21.       max(1212, 326); // double max(double, double);
  22. // 同上, 不会选到base::max
  23. }
复制代码
那么:

  1. struct B
  2. {
  3.       void f();
  4. };

  5. struct D : B
  6. {
  7.       void f(int );
  8. };

  9. D d;      // D确实通过继承得到B::f();
  10. d.f();    // 只是这个作用域里的f只有 D::f(int), 没有 B::f()。
  11. d.B::f(); // 显示调用通过继承得到的B::f();
复制代码
这叫hide派生类中的名字会隐藏基类中的名字
使得基类的名字没有参与重载的资格

与上面名字空间的例子类似, 可以通过using 引入基类的名字。

  1. struct D1 : B
  2. {
  3.       void f(double);
  4.       using B::f;
  5. }

  6. D1 d;
  7. d.f( ... ); // 在这里, 重载候选就有 D1::f与B::f, 根据实际参数来决议
复制代码
4. override

通过基类指针或者引用操作某个派生对象, 调用某个虚函数。
派生类可通过override, 使得该虚函数调用派生类中的版本, 而非基类中的版本。

override和overload是完全不相干的关系。
overload是编译时概念, override是运行时概念。

  1. struct B
  2. {
  3.       virtual ~B();
  4.       virtual void f(int );
  5.       virtual void f(double);
  6. };

  7. void test(B* b)
  8. {
  9. // 这两个调用是由overload决议
  10. // 代码一旦编译完成, 就固定死了, 没得更改。
  11.       b->f(1212);  // B::f(int);
  12.       b->f(3.26);  // B::f(double);
  13.       delete b;
  14. }
复制代码
运行时可以通过传入不同的B的派生类, 影响test的最终行为。

  1. struct D1 : B {};
  2. test(new D1);
  3. // D1没有override任何虚函数, 所以上面两个调用最终是B::f(int)和B::f(double)
复制代码

  1. struct D2 : B
  2. {
  3.       void f(int );
  4. };
  5. test(new D2);
  6. // D2有override一个: B::f(int), 所以, 最终调用是 D2::f(int), B::f(double);
复制代码
如此等等。

再解释一下运行时。
上面的代码编译、链接完毕后, test的行为不能通过overload修改, 但可以通过override修改:

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(int argc, char* argv[])
  4. {
  5.       char const* name = "D1";
  6.       if (argc>1) name = argv[1];
  7.       B* b = 0;
  8.       if (strcmp(name, "D1")==0) b = new D1;
  9.       else if (strcmp(name, "D2")==0) b = new D2;
  10.       ...
  11.       else
  12.       {
  13.             fprintf(sterr,"no derived class named %s", name);
  14.             return -1;
  15.       }
  16.       test(b);
  17.       return 0;
  18. }
复制代码
gcc xxx.cpp -o a.out  编译完毕后, a.out的行为依然可以修改:
a.out D1
a.out D2



大哥们, 中文很乱, 学点E文好不?

评分

参与人数 2可用积分 +9 收起 理由
toniz + 5
tyc611 + 4 代BZ加点分吧,码这么字不容易

查看全部评分

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
3 [报告]
发表于 2010-10-21 16:27 |只看该作者
堆栈应该就是栈。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2010-10-21 16:43 |只看该作者
插了2、3楼的, 你们{:3_204:}

论坛徽章:
0
5 [报告]
发表于 2010-10-21 16:47 |只看该作者
插了2、3楼的, 你们
OwnWaterloo 发表于 2010-10-21 16:43



    这个论坛不能自主删帖啊......才发现

论坛徽章:
0
6 [报告]
发表于 2010-10-21 16:49 |只看该作者
回复 7# liwangli1983


谁说不能~~

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2010-10-21 16:50 |只看该作者
ls两位, 您们是好人{:3_201:}

论坛徽章:
0
8 [报告]
发表于 2010-10-21 16:52 |只看该作者
ls两位, 您们是好人
OwnWaterloo 发表于 2010-10-21 16:50

这不是传说中的好人卡么?又收到一张!看来不只是女同胞们会送我,连男同志也是阿.

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2010-10-21 17:00 |只看该作者
本帖最后由 pmerofc 于 2010-10-21 17:01 编辑

“堆栈”的确是被用得非常似是而非的一个词

概念不清是通病

论坛徽章:
0
10 [报告]
发表于 2010-10-21 18:28 |只看该作者
回复  liwangli1983


谁说不能~~
davelv 发表于 2010-10-21 16:49



        我光往左边看了。。。原来在右边
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP