CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

继承问题?先答对的给分,不难。

楼主liquanle()2003-12-01 22:27:19 在 C/C++ / C++ 语言 提问

class   A{    
      int   ai;    
  };    
  class   B:   public   A{    
      int   bi    
    public:      
        A::ai;   //第一句    
  };    
  **************************************************************    
  class   A{    
      int   ai;    
  };    
  class   B:   public   A{    
      int   bi    
    public:      
      int   ai;   //第二句    
  };    
  上下两种用法,有没有区别,还是根本就不是一个东西,第一种是改变了基类ai的存储类别,第二种,我感觉是不是重新定义了一下,书上没有讲这个。我就不知道了,希望有人能告诉我……  
   
  问题点数:30、回复次数:22Top

1 楼kdush(迷茫过后……还是迷茫……) (love—>kula始终未变)回复于 2003-12-01 22:33:03 得分 0

我认为没有区别,都是把A.ai   的值覆盖掉了.Top

2 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2003-12-01 22:37:52 得分 10

第一种方式编译通不过吧??  
   
  第二种方式从调用方来讲,B::ai把A::ai覆盖了,但其实B的对象中含有两个ai,一个是A的ai,另一个是自己的,只是A::ai永远不会被调用到罢了。除非你在B类的内部函数使用作用域界定符“::”Top

3 楼heguobaoceo(awen)回复于 2003-12-01 22:38:39 得分 0

被覆盖了,  
        其实你可以用virtual   int   ai   去定义咯  
  Top

4 楼liquanle()回复于 2003-12-01 22:58:40 得分 0

第一种是书上原代码,第二种是我自己加的。Top

5 楼zhuang1415(吉力)回复于 2003-12-01 23:01:23 得分 0

第一种是什么意思?  
  第二种是覆盖了A类的ai;如果想继承的话要用virtual   int   ai   在A类中定义ai了Top

6 楼liquanle()回复于 2003-12-01 23:30:32 得分 0

fireseed(奶油狗【一打开BCB,就象在蹲茅坑!】)   ()   信誉:105    
  你说的对,第一种根本就不能通过编译。Top

7 楼xhc_2000(大雪)回复于 2003-12-01 23:42:14 得分 1

第一个通不过吧?谁懂怎么回事?Top

8 楼lovezn0424(宁无悔program)回复于 2003-12-02 15:52:34 得分 1

第一个通不过因为他什么也不是。  
   
  第二个前面的说得不错了。Top

9 楼renfengxing(任风行)回复于 2003-12-02 16:15:17 得分 1

第一个错误,第二个覆盖。Top

10 楼RedFoxC(赤狐)回复于 2003-12-02 16:20:37 得分 0

这两个都通不过编译!!!!!!!Top

11 楼computer386(流星雨)回复于 2003-12-02 16:36:39 得分 3

第一种方式编译通不过  
  第二种:  
  请看CLASS   B的内存布局:  
  ______  
  |B::bi|  
  |_____|  
  |B::ai|  
  |_____|  
  |A::ai|  
  |_____|  
  |vptr   |  
  |_____|  
  不存在覆盖.他们是分配不同的内存!!!!!!!!!!!!!!!!!!  
  请参考<<深度探索C++对象模型>>Top

12 楼computer386(流星雨)回复于 2003-12-02 16:40:04 得分 0

还忘说了在B中,正常情况他没有权限去访问A的成员.除非采用别的办法.但A的成员在B中是存在的!!!!!!!!!!!!!没有覆盖!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Top

13 楼renfengxing(任风行)回复于 2003-12-03 09:00:42 得分 0

楼上说的也有可能~~~  
  <<深度探索C++对象模型>>   54,穷啊~~Top

14 楼Meyer(断水)回复于 2003-12-03 09:21:27 得分 0

virtual   int   ai   ???  
  恕我寡闻Top

15 楼dsao(神农)回复于 2003-12-03 09:36:59 得分 0

computer386(流星雨);   同意你的看法。  
                                            不过这里没有出现virtual关键字。是不是应该没有vptr呀?  
                                            进来讨论一下。Top

16 楼yuanetking(初远)回复于 2003-12-03 09:55:38 得分 0

你第一个是错误的A::aiTop

17 楼yuanetking(初远)回复于 2003-12-03 09:56:51 得分 0

好奇怪的代码,你书的作者,肯定在昏迷状态写下的书,建议,换书!!Top

18 楼cullstar(我踏月色而来╰☆╮)回复于 2003-12-03 10:44:22 得分 10

 
  第一种编译错误,原因:派生类B企图调用基类A的私有数据成员,这样是坚决不允许的,不管是公用继承(public)还是其它两种(private、protected),当然后两种继承方法   能访问基类的权限更小。  
  第二种是在派生类B中再定义个整型量ai,和基类A中的同名变量是两回事。如果想访问基类中的同名变量(在继承方法和变量声明的域   都是有严格要求的),假设同名变量定义在基类的protected保护中,那么利用:public公有继承后,派生类B便可以通过成员函数来访问它,但类B的对象是不能访问的。  
  如:  
  #include   <iostream.h>  
  #include   <conio.h>  
  class   A{  
  protected:  
  int   ai;  
  public:  
  A(){ai=10;}  
  };  
   
  class   B:public   A{  
  int   bi;  
  int   ai;  
  public:  
  B(){ai=20;}  
  void   showDate();  
  };  
   
  void   B::showDate()  
  {  
  cout   <<A::ai<<endl;  
  cout   <<ai;  
  }  
   
  void   main()  
  {  
  B   b;  
  b.showDate();  
  getch();  
  }  
   
  我觉得你有必要看看关于继承模式的书  
   
  Top

19 楼cullstar(我踏月色而来╰☆╮)回复于 2003-12-03 10:58:30 得分 1

有希望交流的可以QQ我  
  QQ24160879  
   
  :public公有继承  
  派生类的成员函数可以访问基类中的protected和public域,但派生类的对象(派生类对象不用我说了吧)只能访问基类的public  
   
  :protected保护继承和:priate私有继承  
  派生类的成员函数可以访问基类中的protected和public域,但派生类的对象(派生类对象不用我说了吧)不能访问基类任何对象  
   
  :protected保护继承模式难以捉摸一般很少使用!!Top

20 楼computer386(流星雨)回复于 2003-12-03 16:06:19 得分 1

TO   dsao(神农)   昨天搞错了没有VPTR  
  应改为关于类信息的一个Slot!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  还有排列次序与编译器有关。不好意思啊!!!!!!!!!!!!!!!!!!!!!!!!!  
  无人子弟。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。  
  Top

21 楼echolx(火凝风)回复于 2003-12-03 16:13:46 得分 1

但是computer386(流星雨)你已经说得很明白了,很多人都认为B::a1会覆盖A::a1呢!Top

22 楼panxiongfei(飞)回复于 2003-12-03 16:17:30 得分 1

同意:  
  第一种方式编译通不过吧??  
   
  第二种方式从调用方来讲,B::ai把A::ai覆盖了,但其实B的对象中含有两个ai,一个是A的ai,另一个是自己的,只是A::ai永远不会被调用到罢了。除非你在B类的内部函数使用作用域界定符“::”  
  楼住的意思可能是,能不能改变继承下来的副类的成员的private   属性。  
  回答是不可能。Top

相关问题

  • 合成与继承(回答了马上给分)
  • 300分求确切答案:子类到底继承什么?
  • 继承问题(100分)
  • 白捡分-----类的继承
  • 白捡分-----类的继承
  • 关于多重继承问题的答谢,请ajoo(jet pig)来领分!
  • 关于多重继承问题的答谢,请pengji(彭乃超)来领分!
  • 关于多重继承问题的答谢,请Dickensi(流星·逐日)(★★★★) 来领分!
  • 编写控件时对话框继承的问题,在线回答给分
  • 送分,关于继承的问题

关键词

  • ai
  • bi
  • virtual
  • 继承
  • 覆盖
  • 基类
  • 派生
  • 同名变量
  • 调用
  • 访问

得分解答快速导航

  • 帖主:liquanle
  • fireseed
  • xhc_2000
  • lovezn0424
  • renfengxing
  • computer386
  • cullstar
  • cullstar
  • computer386
  • echolx
  • panxiongfei

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo