首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象类析构函数与继承的“关机”函数

抽象类析构函数与继承的“关机”函数
EN

Stack Overflow用户
提问于 2018-08-01 11:17:01
回答 1查看 108关注 0票数 0
代码语言:javascript
复制
class System
{
    public:
        virtual ~System() final { Shutdown(); };
        virtual void Shutdown() = 0;
}

class DerivedSystem : public System
{
    public:
        virtual void Shutdown() override;

    private:
        Object* MySelfAllocatedObj;
}

这是我的用例

我有一个管理器,它持有由其他各种“模块”注册的系统*的列表,每个系统*实际上都是被嘲笑的类,系统管理器不知道。

当它们各自的系统*结束/死亡时,这些模块将请求关机()。

那么,如果其中一个DerivedSystem有一个MySelfAllocatedObj (ptr),并将其作为MySelfAllocatedObj()的一部分销毁,那么我的内存会使用当前的体系结构正确地清理吗?

我这样做是为了限制“销毁”函数(即析构函数/关机)的数量,但不希望将析构函数公开给请求该DerivedSystem的“模块”。

如果一个DerievedSystem类声明一个析构函数,会发生什么?

编辑:添加:公共系统(继承)

问题不是我是否应该,问题是,我的记忆是否会被管理员正确地清理掉?

代码语言:javascript
复制
delete System* 

或由请求模块(第三方)调用

代码语言:javascript
复制
SystemManager->RequestShutdown(SystemID...) { System->Shutdown()};

这两条路都会以同样的“记忆被清除”收场,还是我会错过什么?

重点是不要在这两个函数中重复代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 12:05:39

在析构函数中,任何派生对象的生存期已经结束,就像构造函数中的一样,任何派生对象的生存期尚未开始。对析构函数(或构造函数)中的虚拟函数的调用将被静态地分派,因为不再有派生对象(或者在构造函数情况下还不存在派生对象)可以将其动态地分派到该对象。除非您定义了System::Shutdown,否则程序不太可能成功地链接。

此外,声明基final的析构函数将阻止您派生这样的基,因为即使是派生类的隐式生成析构函数也将是“覆盖”。

如果我的记忆被经理破坏了,我的记忆会被正确地清理吗? 删除系统*

您的伪代码不清楚,但根据我的描述,您删除了System*类型的指针。

不,因为1. DerivedSystem::shutdown从来不被调用,2. DerivedSystem格式不正确,因为它覆盖了最终的析构函数,并且程序不太可能编译。

系统管理器->RequestShu倒计时(SystemID.){System->关机()};

这将调用DerivedSystem::shutdown,因此它应该在这方面起作用。尽管如此,这门课的不良结构仍然是个问题。

当它们各自的系统*结束/死亡时,这些模块将请求关机()。 我这样做是为了限制“销毁”函数(即析构函数/关机)的数量

如果您想限制销毁函数的数量,一个简单的解决方案就是根本不提供一个Shutdown函数,而是让系统在其应该死的时候摧毁它们各自的系统。

如果您确实需要一个单独的Shutdown函数(我不建议这样做),并且希望在析构函数中重用它,那么您需要在每个派生类的析构函数中调用它。

PS。显式删除和指向拥有资源的裸指针非常容易出错。最好用智能指针代替。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51631926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档