如何将std :: unique_ptr <Parent>与只具有受保护虚拟析构函数的readonly Parent类一起使用

Bin*_*hou 1 c++ virtual destructor protected unique-ptr

test.cpp,最小测试代码

#include <memory>
class Parent{ // A Interface That I can't modify! can't add 'friend' or modify 'protected'
protected:
    virtual ~Parent(){};
public:
    // other interfaces that no one is suitable for 'delete this'
};

class Derived : public Parent{ // My class
public:
    virtual ~Derived(){}
};

class Deleter : public Parent // My deleter to use unique_ptr
{
public:
    void operator()(Parent* ptr)
    {
        delete ptr; // Actually Wrong? cannot access ptr's protected & private member
    }
};

int main(int argc, char* argv[])
{
    Deleter deleter;
    // use of std::unique_ptr<Parent> error because of delete, so define my deleter to handle delete event.
    std::unique_ptr<Parent, Deleter>(dynamic_cast<Parent*>(new Derived()), deleter);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如上面的代码.

有一个带有受保护虚拟析构函数的只读接口类"Parent".

unique_ptr<Parent>shared_ptr<Parent>将用于管理从Parent派生的类的对象.

但是unique_ptr<Parent>( new Derived())由于删除操作直接使用带有编译错误的结果.

限制不要编辑Parent类的定义.我尝试创建一个能够删除指向Parent的指针的删除器.

经过一些测试,我发现在Derived类的方法中,父对象的protected&private成员无法访问.

我很好奇是否有一些解决方案,unique_ptr<Parent>没有父类的修改定义就可以使用.

谢谢你的帮助.

jwm*_*jwm 6

您的类层次结构格式错误.基类的受保护的析构函数旨在防止您尝试执行的操作.

制作析构函数而非公开的原因通常是强制执行单例模式,或其他一些排除破坏的原因.多态基类对受保护的析构函数几乎没有理由.