代码如下:
#include <iostream>
#include <list>
using namespace std;
//基类
class Object
{
public:
list<Object *> child; //创建子组件链表
public:
Object(Object *parent = nullptr)//默认值设置为空
{
if(parent!=nullptr) //判断创建对象时是否给定父组件
parent->child.push_back(this);//将自己的地址放入子链表中
cout<<"构造函数"<<endl;
}
virtual ~Object() //设置成虚析构函数
{
for(auto p=child.begin();p!=child.end();p++)//循环判断孩子链表中是否存在数据
{
delete *p; //释放链表中所存储地址的空间
}
cout<<"析构函数"<<endl;
}
};
//派生类
class A : public Object
{
public:
A(Object *parent=nullptr) //默认值设置为空
{
if(parent!=nullptr) //判断创建对象时是否给定父组件
parent->child.push_back(this);
cout<<"A构造函数"<<endl;
}
virtual ~A()
{
cout<<"A析构"<<endl;
}
};
class B : public Object
{
public:
B(Object *parent=nullptr)
{
if(parent!=nullptr)
parent->child.push_back(this);
cout<<"B构造函数"<<endl;
}
virtual ~B()
{
cout<<"B析构"<<endl;
}
};
int main()
{
A s;
A *q=new A(&s); //创建对象时给定父组件,在堆区申请的空间将会被存入孩子链表并在析构时被释放
B *p=new B(&s);
return 0;
}