从基 class 派生 class 的 std::unique_ptr 的指针

Pointer to a std::unique_ptr of derived class from base class

我正在尝试创建一个可以指向任何 std::unique_ptr<DerivedClass>.

std::unique_ptr<BaseClass>*

我有以下 class 层次结构:

[InputHandler] <--inherits from-- [DrawingTool] <--inherits from-- [ToolName]

以及以下代码:

std::unique_ptr<DrawingTool> *active_tool;
active_tool = tool_manager.getCurTool();   // Returns a unique_ptr<DrawingTool>*

std::unique_ptr<InputHandler> *cur_input_handler = active_tool;

然而这给出了错误:

 error: cannot convert ‘std::unique_ptr<DrawingTool>*’ to ‘std::unique_ptr<InputHandler>*’ in initialization

我怎样才能完成这项工作?

如果您想引用代码中别处拥有的对象,std::shared_ptr 是您的方法(至少如果您想实现示例中显示的内容,这是您的代码的一部分题)。然后,如果你想将基础 class std::shared_ptr 向下转换为派生的 class std::shared_ptr 你可以执行以下操作:

#include <iostream>
#include <memory>

struct Base {};

struct Derived : Base {};

int main() {
    std::shared_ptr<Base> base = std::make_shared<Base>();
    std::shared_ptr<Derived> derived = std::static_pointer_cast<Derived>(base);

    return 0;
}

此外,以下代码可能会模仿您的情况以及您想要更好地实现的目标:

#include <iostream>
#include <memory>

struct Base {};

struct Derived : Base {};

std::unique_ptr<Base> const& get_unique_ptr() {
    static std::unique_ptr<Base> base = std::make_unique<Base>();
    return base;
}

int main() {
    std::unique_ptr<Base> const& base = get_unique_ptr();
    std::unique_ptr<Derived> derived(static_cast<Derived*>(base.get()));

    return 0;
}

请注意,上述解决方案可能会导致释放同一指针两次的意外行为。