使用多态性时的五法则

Rule of five when using polymorphism

提问人:incubus 提问时间:7/6/2021 最后编辑:François Andrieuxincubus 更新时间:7/6/2021 访问量:266

问:

在使用接口(无论如何是这个概念)和抽象类时,我试图弄清楚五法则,并努力理解规则是如何工作的。

假设我有一个这样的布局:

#include <memory>
#include <optional>
#include <string>

class IEventInterface {
    protected:
        IEventInterface() = default;
        
    public:
        virtual ~IEventInterface() = default;
        
        /* rule of 5 says i need these too (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-five) */
        IEventInterface(const IEventInterface&) = delete;               // copy constructor
        IEventInterface& operator=(const IEventInterface&) = delete;    // copy assignment
        IEventInterface(IEventInterface&&) = delete;                    // move constructor
        IEventInterface& operator=(IEventInterface&&) = delete;         // move assignment
        
        virtual std::optional<std::string> getEventText() noexcept = 0;
        virtual bool isEnabled() noexcept = 0;
};

class AbstractEvent : public IEventInterface {
    public:
        AbstractEvent() : m_enabled { true } {}
        virtual ~AbstractEvent() = default;
        
        /* Do i need to disable the other copy/move operators here too? */
        
        bool isEnabled() noexcept override {
            return m_enabled;
        }
    private:
        bool m_enabled;
};

class EventToday final : public AbstractEvent {
    public:
        EventToday() = default;
        virtual ~EventToday() {
            // some additional cleanup steps are required so no default here
        }
        
        std::optional<std::string> getEventText() noexcept override {
            // some code here to get the event text....
        }
        std::unique_ptr<Collector> m_collector;
        
        /* Do i need to disable the other copy/move operators here too? */
};

在其他一些代码中,我有一个充满 IEventInterface 的向量,例如std::vector<std::unique_ptr<IEventInterface>> m_events;

执行五条规则的正确位置在哪里?由于该类需要为某些清理定义析构函数,因此它们需要启动,但我不确定在哪里? 在上面的示例中,我将它们放在接口类中,但我怀疑这是错误的,因为接口或抽象类中的任何复制/移动/析构函数都不需要定义或删除。EventToday

C++ 多态性 五法则

评论

0赞 463035818_is_not_an_ai 7/6/2021
您能解释一下需要清理什么吗?具体事件管理的资源是什么?
4赞 François Andrieux 7/6/2021
由于所有内容都继承了移动和复制构造函数以及赋值运算符,因此已经不可复制且不可移动。即使拥有资源,也已经遵守了 5 规则。IEventInterfacedeleteEventTodayEventToday
0赞 463035818_is_not_an_ai 7/6/2021
您显示的两个子类可以遵循 0 规则。目前尚不清楚为什么您需要实现 5 个中的任何一个。
0赞 Nathan Pierson 7/6/2021
使用析构函数不需要定义或删除剩余的 4 个析构函数。default
0赞 alter_igel 7/6/2021
@FrançoisAndrieux听起来像是一个答案

答: 暂无答案