| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 744 人关注过本帖
标题:还是继承与派生。。。
只看楼主 加入收藏
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
结帖率:80%
收藏
已结贴  问题点数:18 回复次数:11 
还是继承与派生。。。
先上代码~~~

 #include<iostream.h>
        class A{
        private:
          int a;
        public:
          A(){ a=0;cout<<"A′s defanlt constructor called.\n"; }
          A(int i){ a=i;cout<<"A′s constructor called.\n"; }
          void print(){ cout<<a<<","; }
          ~A(){ cout<<"A′s destructor called.\n"; }
          int Geta(){ return a; }
        };
        class B: public A{
        public:
          B(){ b=0;cout<<"B′s defanlt constructor called.\n"; }
          B(int i,int j,int k):A(i),aa(j){ b=k;  cout<<"B′s constructor called.\n"; }
          void print();
          ~B(){ cout<<"B′s destructor called.\n"; }
        private:
          int b;
          A aa;                //子对象,或称为成员对象
        };
       void B::print(){
          A::print();
          cout<<b<<","<<aa.Geta()<<endl;
        }
        void main(){
          B bb[2]={B(1,2,5),B(3,4,7)};
          for(int i=0;i<2;i++) bb[i].print();
        }


运行结果:
A's constructor called.
A's constructor called.
B's constructor called.
A's constructor called.
A's constructor called.
B's constructor called.
1,5,2
3,7,4
B's destructor called.
A's destructor called.
A's destructor called.
B's destructor called.
A's destructor called.
A's destructor called.


我想问下,为什么在子对象调用构造函数的时候,调用的是
 A(int i){ a=i;cout<<"A′s constructor called.\n"; }
而不是
 A(){ a=0;cout<<"A′s defanlt constructor called.\n"; }
子对象aa不是不带参数吗?
后面析构函数调用同问。。。。不懂啊,到底什么时候调用缺省构造函数和缺省析构函数?
搜索更多相关主题的帖子: private include public return called private include public return called 
2011-08-22 00:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
那你写 aa(j) 是干什么的呀
2011-08-22 08:19
天蝎殿
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-8-22
收藏
得分:0 
子对象aa是带参数的。
以main function的B(1, 2, 5)为例子:
B(1, 2, 5) =  
                B(1,2,5)
                : A(1)
                , aa(2)
                {
                  b=5;  
                  cout<<"B′s constructor called.\n";
                 }

于是,当B(1,2,5)被叫到时, contructor开始调出 private member variable A aa 的constructor A(int i)
导致第一个正式被打印出结果是A(int i){}里面的内容。


并且虽然不知道楼主想要问什么,不过继承和派生都没有用到。。。
先学一下virtual和protected member variable吧。
2011-08-22 11:01
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
和上次的问题一模一样,都白和你讲了.

都不结贴我郁闷那!
2011-08-22 11:20
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:0 
我上次说了那么多你都没看! 痛心啊~~~~~~~~
你的 B bb 调用的是有参数的构造函数;所以a的构造也是调用的有参构造!!你试试 B b ; 看看结果就知道区别所在了!

君生我未生 我生君以老
2011-08-22 15:11
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
收藏
得分:0 
回复 5楼 jcw08120110
试代码没什么啊,可是我不知道为什么会出现那样的结果。。。
其实我想问的就是,调用含参的构造或析构函数还是调用默认的构造或析构函数,到底看哪里啊?判断子对象是否含参数,到底看哪里的代码啊?
2011-08-22 21:17
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
收藏
得分:0 
回复 2楼 rjsp
你的意思是说,判断子对象带不带参数,要看
B(int i,int j,int k):A(i),aa(j){ b=k;  cout<<"B′s constructor called.\n"; }
这一行代码?
也就是要看派生类构造函数初始化表中的子对象有没有参数?
2011-08-22 21:20
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
请问楼主,你说的是不是这个意思
在class B 中写private A aa 就犹如在main函数中写
int main()
{
     A aa;
     return 0;
}
也就是说相当于是再class B中定义了一个变量
因为在main函数中有一个 A(){ a=0;cout<<"A′s defanlt constructor called.\n"; }的调用,所以B的构造函数B(int i,int j,int k):A(i),aa(j){ b=k;  cout<<"B′s constructor called.\n"; }
也应该有一个A′s defanlt constructor called.\n这样的东西出现
2011-08-22 21:58
sunflower44
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-15
收藏
得分:0 
回复 8楼 specilize
不是。。。没那么复杂。我就是看着
A aa;                //子对象,或称为成员对象
这行代码对aa没有初始化值,所以要调用那个没有参数的构造函数。。。
如果写的是
A aa(1);                //子对象,或称为成员对象
我就用那个有参数的了。
因为我不知道从什么代码判断有参还是无参
2011-08-22 22:29
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
那不就是我说的那个意思了,你把
class B: public A{
        private:
          int b;
          A aa;                //子对象,或称为成员对象
        };
中的A aa理解成相当于是在定义一个变量,所以就应该调用那个没有参数的A的构造函数
不然你这样试试
class B: public A{
        private:
          int b;
          A aa(1);                //子对象,或称为成员对象
        };
它肯定会给你提示错误的,所以就说明不是你理解的那个意思了嘛
它这样写
class B: public A{
        private:
          int b;
          A aa;                //子对象,或称为成员对象
        };
的意思不是在定义一个A变量,而是说B中含有A这个成员,而B中的A的初始化是在
B(int i,int j,int k):A(i),aa(j){ b=k;  cout<<"B′s constructor called.\n"; }这里面的aa(j)进行初始化,还是不懂你就这样写B(int i,int j,int k):A(i),aa(){ b=k;  cout<<"B′s constructor called.\n"; }或者这样写
B(int i,int j,int k):A(i){ b=k;  cout<<"B′s constructor called.\n"; }就能看到
A′s defanlt constructor called了
2011-08-23 07:40
快速回复:还是继承与派生。。。
数据加载中...
 
   



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

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