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;
}
如上代码。
有一个带有 protected 虚拟析构函数的只读接口(interface)类“Parent”。
unique_ptr<Parent>
或 shared_ptr<Parent>
将用于管理从 Parent 派生的类的对象。
而是直接使用unique_ptr<Parent>( new Derived())
由于删除操作导致编译错误。
限制不编辑Parent
的定义类(class)。我尝试制作一个能够删除指向 Parent 的指针的删除器。
经过一些测试,我发现在Derived类的方法中,Parent对象的protected & private成员是无法访问的。
我很好奇是否有一些解决方案,可以使用 unique_ptr<Parent>
不修改父类的定义。
谢谢你帮助我。
最佳答案
您的类层次结构不正确。基类的 protected 析构函数是设计以防止您尝试执行的操作。
创建除 public 之外的析构函数的原因通常是为了强制执行单例模式,或者其他一些原因来阻止破坏。多态基类几乎没有理由使用 protected 析构函数。
关于c++ - 如何将 std::unique_ptr<Parent> 与具有 protected 虚拟析构函数的只读父类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49812841/