派生类基础问题

angelcm51 2008-03-26 09:27:02
B是A的一个派生类,声明bb1的时候会先进入基类A中,显示A's default constructor called.
可是接下来为什么是A's default constructor called.
B's default constructor called.
最后析构的时候也是,进入基类中
B's destructor called.
A's destructor called.
A's destructor called.
在A中析构了2次,为什么?
#include "iostream"
using namespace std;
class A
{
public:
A(){a=0;cout<<"A's default constructor called.\n";}
A(int i){a=1;cout<<"A's constructor called.\n";}
~A(){cout<<"A's destructor called.\n";}
void print() const{cout<<a<<",";}
int geta(){return a;}
private:
int a;
};
class B:public A
{
public:
B(){b=0,cout<<"B's default constructor called.\n";}
B(int i,int j,int k);
~B(){cout<<"B's destructor called.\n";}
void print();
private:
int b;
A aa;
};
B::B(int i,int j,int k):A(i),aa(k)
{
b=j;
cout<<"B's constructor called.\n";
}
void B::print()
{
A::print();
cout<<b<<","<<aa.geta()<<endl;
}
void main()
{
B bb1;
B bb2(1,2,3);
bb1.print();
bb2.print();
}

结果是:
A's default constructor called
A's default constructor called
B's default constructor called
A's constructor called.
A's constructor called.
B's constructor called.
0,0,0
1,2,1
B's destructor called.
A's destructor called.
A's destructor called.
B's destructor called.
A's destructor called.
A's destructor called.
...全文
32 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelcm51 2008-03-26
  • 打赏
  • 举报
回复
谢谢1楼的。
angelcm51 2008-03-26
  • 打赏
  • 举报
回复
为什么在第一次回到基类中调用了A's default constructor called
到达bb2(1,2,3)的时候又有一次
A's default constructor called
B's default constructor called
不明白,自学C++迷茫啊。。。
brookmill 2008-03-26
  • 打赏
  • 举报
回复
B从A派生,另外B里面还有一个A类的成员,所以各自调用一次A的构造函数。
这种设计有点奇怪……
nicky_zs 2008-03-26
  • 打赏
  • 举报
回复
每个子类对象都会隐式地包含一个基类对象。LZ的class B中既隐式地包含了一个A类对象,又显式地包含了一个。所以在B的constructor被调用之前,当然会有两次A的constructor.

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧