#include <iostream>
#include <list>
using namespace std;
class Object;//前置声明类
//类型重定义,list模板<Object *>指针 ObjectList
typedef list<Object *> ObjectList;
class Object
{
public:
ObjectList children;//记录子组件的指针
Object(Object * parent = nullptr)//构造函数声明,参数是父组件的指针
{
if(parent != nullptr)
{
//说明该组件有父组件,那么,其父组件就有children链表
//我们就要将该组件的地址放入父组件的孩子链表中,以便于析构父组件时,将子组件也进行析构
parent->children.push_back(this);//将子组件放到链表中
}
}
virtual ~Object()//虚析构函数
{
//it是迭代器(?指针)
for(auto it = children.begin();it!=children.end();it++)//循环析构链表中的所有对象
{
delete *it;
}
}
// ObjectList &childrenList()//指针指向了children列表
// {
// return this->children;//主要是为了展示,没啥用,可以没有
// }
};
//定义测试类
class A:public Object//公有继承object
{
public:
A(Object *parent = nullptr)
{
//判断该组件是否设置父组件
if(parent!=nullptr)
{
parent->children.push_back(this);
}
cout<<"A::构造函数"<<endl;
}
~A()
{
cout<<"A::析构函数"<<endl;
}
};
class B:public Object//公有继承object
{
public:
B(Object *parent = nullptr)
{
//判断该组件是否设置父组件
if(parent!=nullptr)
{
parent->children.push_back(this);
}
cout<<"B::构造函数"<<endl;
}
~B()
{
cout<<"B::析构函数"<<endl;
}
};
int main()
{
A aa;//对象aa
B *p = new B(&aa);//aa是B的父组件
cout << "Hello World!" << endl;
return 0;
}
QT对象树模型
最新推荐文章于 2025-11-30 11:52:39 发布
本文通过一个C++代码示例展示了对象管理、继承以及析构过程。类`Object`及其派生类`A`和`B`演示了如何在构造时将子对象添加到父对象的列表中,以及在析构时正确删除所有子对象。代码还涉及到了`list`容器的使用以及虚析构函数的重要作用。
766

被折叠的 条评论
为什么被折叠?



