C++类的问题,构造函数和析构函数

classA{public:A(inti){cout<<"A";}~A(){}};classB{public:B(intj){cout<<"B";}~B(){}};cla... class A{
public:
A(int i){cout<<"A ";}
~A(){}
};

class B{
public:
B(int j){cout<<"B ";}
~B(){}
};

class C{
public:
C(int k){cout<<"C ";}
~C(){cout<<"~C ";}
};

class D : public C{
public:
D(int i,int j,int k):a(i),b(j),C(k){cout<<"D ";}
~D(){cout<<"~D ";}

private: A a;
B b;

};

int main(int argc){
C* pc = new D(1,2,3);
delete pc;

return 0;}
结果是什么?
展开
 我来答
百度网友6fe74e2
2013-03-31 · TA获得超过6593个赞
知道大有可为答主
回答量:1973
采纳率:100%
帮助的人:266万
展开全部

new D(1,2,3);

执行D的构造函数,由于他是以初始化表的形式出现的,同时D继承自C:

D(int i,int j,int k):a(i),b(j),C(k){cout<<"D ";}

依次进行初始化

C(k)   ------> 调用类 C的构造函数C(int k){cout<<"C ";} ----->输出字符 C

a(i)    ------->a是A类的对象引用,调用类 A 的构造函数A(int i){cout<<"A ";} ------>输出字符 A

b(j)    ------->b是B类的对象引用,调用类 B的构造函数B(int j){cout<<"B ";}  ------->输出字符B

cout<<"D ";------------------------------------------------------->输出字符D

delete pc;------>注意pc的声明 :C *pc,他是指向C类对象的指针,delete应该调C类的析构函数

        所以最后输出:   ~C

 

合在一起就是:C A B D ~C

追问
为什么没有调用D的析构函数?
追答
就是因为声明的问题   C *pc,他实际上不管具体指向的是基类对象还是派生类对象,在delete时,只会去调声明时的的类的析构函数,所以调C,不调D的析构函数。
半帘泥燕
2013-03-31 · TA获得超过130个赞
知道答主
回答量:63
采纳率:0%
帮助的人:30.1万
展开全部
正确顺序: C A B D ~C
1、先构造父类,D是C的子类,故先构造C,输出C
2、然后根据参数构造A和B,这两个的构造顺序,是根据在D中a和b定义的顺序定的。先定义a,故先构造A。
3、最后构造D
4、释放空间,所以析构C
追问
那为什么没有调用派生类D的析构函数呢?他析构的顺序不应该是与构造函数调用的顺序相反嘛?
追答
因为你在主函数里创建的C类的对象,析构肯定调用C的析构函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式