| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1055 人关注过本帖
标题:派生类的方法疑问
只看楼主 加入收藏
H
Rank: 1
等 级:新手上路
帖 子:33
专家分:5
注 册:2009-4-18
结帖率:75%
收藏
 问题点数:0 回复次数:10 
派生类的方法疑问
#include <iostream.h>
class CRoot{
  public:
    int small;
    CRoot()
    {small= 2; }
    CRoot(int n)
    { small = n;}
    void showsmall()
    { cout<<"small="<<small<<endl; }
};
class CDer1:public CRoot
{
  public:
      CDer1(int m):CRoot(m)      { }
};
class CDer2:public CRoot
{
    public:
       int small;
       CDer2(int n=0) {small=n; }
};
void main()
{     CRoot A;
      CDer1 B(3);
      CDer2 C;
      A.showsmall(); B.showsmall(); C.showsmall();
 }
运行结果:
 
为什么是small=2
        small=3
        small=2

搜索更多相关主题的帖子: 派生类 疑问 
2009-12-28 21:04
zj33
Rank: 2
等 级:论坛游民
帖 子:12
专家分:25
注 册:2008-10-2
收藏
得分:0 
我想你奇怪的是C.showsmall( );显示结果是small=2, CDer2调用CRoot的函数showsmall( ),基类的showsmall( )
不可能知道派生类的small, 它只是打印基类的small,你只要在CDer2中重定义showsmall(),
最后一个显示就会是:small=0
我c++也一般,大家讨论讨论,共同进步。
2009-12-28 21:26
H
Rank: 1
等 级:新手上路
帖 子:33
专家分:5
注 册:2009-4-18
收藏
得分:0 
我昨天刚学的,请多多指教!

[url=http://shop59823293.]韩版 优雅 通勤 时尚女包[/url]
2009-12-28 21:42
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
没有问题呀?如果你有疑问,一定是对C的输出有疑问吧,这里没有问题, CDer2 C;并没 有调用CDer2的构造函数,而调用了它的默认构造函数,从而调用了CRoot的默认构造函数,结果自然是2了。
2009-12-28 22:17
H
Rank: 1
等 级:新手上路
帖 子:33
专家分:5
注 册:2009-4-18
收藏
得分:0 
a,b,c我都看不懂呢。。。。。。      

[url=http://shop59823293.]韩版 优雅 通勤 时尚女包[/url]
2009-12-28 22:41
H
Rank: 1
等 级:新手上路
帖 子:33
专家分:5
注 册:2009-4-18
收藏
得分:0 
a为什么不是0?b为什么是3,c为什么是2?

[url=http://shop59823293.]韩版 优雅 通勤 时尚女包[/url]
2009-12-28 22:51
英英
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:133
注 册:2009-3-3
收藏
得分:0 
构造函数是用于对象的初始化的,在声明一个对象的同时,程序会自动调用相应的构造函数,A对象没有参数,所以在创建A的时候调用的是无参的构造函数,里面给small赋值为2,所以A.showsmall的输出是2,同理B对象创建时调用有参构造函数,所以最后结果时3,而类CDer2继承自1,所以创建C时调用父类构造函数,无参的,所以输出是2
2009-12-28 22:52
H
Rank: 1
等 级:新手上路
帖 子:33
专家分:5
注 册:2009-4-18
收藏
得分:0 
a,b都明白了。

c还是不明白。是不是因为CDer2 C无参数,而他自己的方法只有有参数的,所以它自动调用父类的构造函数呢?

[url=http://shop59823293.]韩版 优雅 通勤 时尚女包[/url]
2009-12-28 22:59
zj33
Rank: 2
等 级:论坛游民
帖 子:12
专家分:25
注 册:2008-10-2
收藏
得分:0 
CDer2的构造函数是CDer2(int n = 0){small = n;} CDer2 C;
派生类中small是0, 基类的small = 2, showsmall是2,因为基类函数showsmall打印出基类的small,如果定义函数void CDer2::showsmall(){ cout <<"small=" <<small<<endl;}
C.showsmall(); 输出是small=0
2009-12-28 23:08
英英
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:133
注 册:2009-3-3
收藏
得分:0 
声明类对象的时候,系统会自动调用相应的构造函数;对于继承,声明派生类对象时,系统先调用基类的构造函数 ,再调用自身的构造函数
A是CRoot类对象,声明时调用CRoot类的构造函数,small赋值为2,输出是2
CDer1(int m):CRoot(m){}该语句表明CDer1的构造函数只调用基类的有参构造函数,而自身的函数体不做任何实现,所以B.showsmall()最后输出是3
声明C对象时,先调用基类中参数符合的构造函数(本程序调用的是无参的构造函数),后调用自身的,由于该类中的构造函数参数不符,所以最后的结果就是执行完基类构造函数的结果,所以是2
2009-12-29 21:51
快速回复:派生类的方法疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017988 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved