继承/组合关系时 构造/析构函数执行顺序
#include <iostream>
using namespace std;
class A{
public:
A(){
cout<<"A"<<endl;
}
~A(){
cout<<"~A"<<endl;
}
};
class B:public A{
public:
B(){
cout<<"B"<<endl;
}
~B(){
cout<<"~B"<<endl;
}
};
class C:public B{
public:
C(){
cout<<"C"<<endl;
}
~C(){
cout<<"~C"<<endl;
}
};
class D{
private:
C c;
public:
D(){
cout<<"D"<<endl;
}
~D(){
cout<<"~D"<<endl;
}
};
int main(){
cout<<"继承关系:A<-B<-C"<<endl;
C c;
cout<<"组合关系: D包含C对象成员"<<endl;
D d;
输出
(base) ➜ Cpp ./constructSequence
继承关系:A<-B<-C
A
B
C
组合关系: D包含C对象成员
A
B
C
D
~D
~C
~B
~A
~C
~B
~A
虚析构函数存在的意义
#include <iostream>
using namespace std;
class father{
public:
virtual ~father(){
cout<<"desFather"<<endl;
}
virtual void func(){
cout<<"father virFunc"<<endl;
}
};
class son:public father{
public:
virtual ~son(){
cout<<"desSon"<<endl;
}
virtual void func(){
cout<<"son virFun"<<endl;
}
};
int main(){
father *f = new son;
f->func();
delete f;
return 0;
}
输出:
(base) ➜ Cpp ./virtualDes
son virFun
desSon
desFather
如果析构函数不是虚函数,那么只释放父类,不释放子类。