免费注册 查看新帖 |

Chinaunix

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

[C++] 质问C++关于基类指针指向派生类对象的问题!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-15 21:23 |只看该作者 |倒序浏览
本帖最后由 边学CPP边骂CPP 于 2012-10-15 21:34 编辑
  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5. public:
  6.         virtual void print1()
  7.         {
  8.                 cout<<" A print 1"<<endl;
  9.                 return;
  10.         }

  11.     void print2()
  12.         {
  13.                 cout<<" A print 2"<<endl;
  14.                 return;
  15.         }
  16. };

  17. class B : public A
  18. {
  19. public:
  20.         void print1()
  21.         {
  22.                 cout<<" B print 1"<<endl;
  23.                 return;
  24.         }

  25.     void print2()
  26.         {
  27.                 cout<<" B print 2"<<endl;
  28.                 return;
  29.         }
  30.        
  31.     void print3()
  32.         {
  33.                 cout<<" B print 3"<<endl;
  34.                 return;
  35.         }

  36. };

  37. int main()
  38. {
  39.         B   b;
  40.         A*  pa = &b;
  41.         pa->print1();
  42.         pa->print2();
  43.         pa->print3();  // 这句编译不过。
  44.        
  45.         return 0;
  46. }

复制代码
1. pa->print1();调用的是B类的print1函数,但B类的print1函数前没有virtual关键字,是隐式转成虚拟函数了么?如果是这样,我认为还是在编译时提醒程序员手动加上 virtual 为好,否则很影响程序的可读性,C++你他妈的不该隐式的也给隐式了!!!

2. 你妈的C++你他妈的认为用基类指针指向派生类对象后,就可以像 pa->print2(); 这样调用基类A的print2函数了,C++你认为这样设计合乎逻辑是吧,那么请问C++,因为 pa 指向的是B类对象,pa->print3();调用B类的print3不是更合理么,为什么你不允许这样做???

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2012-10-16 09:22 |只看该作者
当你要喷一个事物的时候,你需要先搞清楚这个事物的概念,以及为什么这样做。
否则你就会让人觉得脑袋不正常,是it界的凤姐。

论坛徽章:
0
3 [报告]
发表于 2012-10-16 09:34 |只看该作者
建议封了LZ 整天在这蹦跶

论坛徽章:
6
寅虎
日期:2013-10-10 21:59:16狮子座
日期:2013-11-12 09:24:41金牛座
日期:2013-12-14 17:02:23酉鸡
日期:2014-01-16 12:34:37技术图书徽章
日期:2014-02-15 12:52:31巨蟹座
日期:2014-05-17 14:09:52
4 [报告]
发表于 2012-10-16 10:02 |只看该作者
1、如果从可读性来说,c++的做法在这里就简洁明了,我们只关心父类的成员函数是否virtual,谁会关心子类?

2、父类指针指向子类对象,是从父类的行为解释子类对象,集合里当然不会有print3() 。

论坛徽章:
0
5 [报告]
发表于 2012-10-16 11:25 |只看该作者
本帖最后由 边学CPP边骂CPP 于 2012-10-16 11:25 编辑

回复 4# fergon


    1、看到子类里的函数,谁不想知道它是否是virtual

2、父类的指针已经指向子类对象,有print3() 说不出什么。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
6 [报告]
发表于 2012-10-16 12:25 |只看该作者
回复 1# 边学CPP边骂CPP


    这费劲,我看您还是用 C# 比较好。
  1. ECMA标准列出的C#设计目标:

  2. C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言
  3. 此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(Garbage Collection,指一种自动内存释放技术)。软件必须做到强大、持久,并具有较强的编程生产力。
  4. 此种语言为在分布式环境中的开发提供适用的组件开发应用。
  5. 为使程序员容易迁移到这种语言,源代码的可移植性十分重要,尤其是对于那些已熟悉C和C++的程序员而言。
  6. 对国际化的支持非常重要。
  7. C#适合为独立和嵌入式的系统编写程序,从使用复杂操作系统的大型系统到特定应用的小型系统均适用。
  8. 虽然C#程序在存储和操作能力需求方面具备经济性,但此种语言并不能在性能和尺寸方面与C语言或汇编语言相抗衡。[来源请求]
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-10-16 13:00 |只看该作者
真是无语了,楼主,你要学的东西还很多。另外,话说学c/c++而不学操作系统,不了解点硬件是没有什么突破的。

论坛徽章:
0
8 [报告]
发表于 2012-10-16 13:08 |只看该作者
本帖最后由 边学CPP边骂CPP 于 2012-10-16 13:08 编辑
foxwb 发表于 2012-10-16 13:00
真是无语了,楼主,你要学的东西还很多。另外,话说学c/c++而不学操作系统,不了解点硬件是没有什么突破的。 ...


回答问题,别装深沉
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP