注册 登录
编程论坛 C++教室

派生类的方法疑问

H 发布于 2009-12-28 21:04, 1055 次点击
#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

10 回复
#2
zj332009-12-28 21:26
我想你奇怪的是C.showsmall( );显示结果是small=2, CDer2调用CRoot的函数showsmall( ),基类的showsmall( )
不可能知道派生类的small, 它只是打印基类的small,你只要在CDer2中重定义showsmall(),
最后一个显示就会是:small=0
我c++也一般,大家讨论讨论,共同进步。
#3
H2009-12-28 21:42
我昨天刚学的,请多多指教!
#4
debroa7232009-12-28 22:17
没有问题呀?如果你有疑问,一定是对C的输出有疑问吧,这里没有问题, CDer2 C;并没 有调用CDer2的构造函数,而调用了它的默认构造函数,从而调用了CRoot的默认构造函数,结果自然是2了。
#5
H2009-12-28 22:41
a,b,c我都看不懂呢。。。。。。      
#6
H2009-12-28 22:51
a为什么不是0?b为什么是3,c为什么是2?
#7
英英2009-12-28 22:52
构造函数是用于对象的初始化的,在声明一个对象的同时,程序会自动调用相应的构造函数,A对象没有参数,所以在创建A的时候调用的是无参的构造函数,里面给small赋值为2,所以A.showsmall的输出是2,同理B对象创建时调用有参构造函数,所以最后结果时3,而类CDer2继承自1,所以创建C时调用父类构造函数,无参的,所以输出是2
#8
H2009-12-28 22:59
a,b都明白了。

c还是不明白。是不是因为CDer2 C无参数,而他自己的方法只有有参数的,所以它自动调用父类的构造函数呢?
#9
zj332009-12-28 23:08
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
#10
英英2009-12-29 21:51
声明类对象的时候,系统会自动调用相应的构造函数;对于继承,声明派生类对象时,系统先调用基类的构造函数 ,再调用自身的构造函数
A是CRoot类对象,声明时调用CRoot类的构造函数,small赋值为2,输出是2
CDer1(int m):CRoot(m){}该语句表明CDer1的构造函数只调用基类的有参构造函数,而自身的函数体不做任何实现,所以B.showsmall()最后输出是3
声明C对象时,先调用基类中参数符合的构造函数(本程序调用的是无参的构造函数),后调用自身的,由于该类中的构造函数参数不符,所以最后的结果就是执行完基类构造函数的结果,所以是2
#11
zb07nju2009-12-30 16:55
Class CDer2由于你自己已经写了一个构造函数,所以就不会有默认的构造函数,因为你的CDer2类继承了CRoot类,所以声明CDer2 C;的时候会默认调用CRoot的无参构造函数,所以small会被初始化为2,当你的C对象调用showsmall()函数的时候,是调用的父类的showsmall()函数,也就会显示出small = 2的结果,要想显示small = 0,只要自己在CDer2类中写一个showsmall()函数,覆盖父类的showsmall()函数。
1