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;}
结果是什么? 展开
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;}
结果是什么? 展开
2个回答
展开全部
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的析构函数。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询