gpt4 book ai didi

c++ - 从基类转换为未知的派生类

转载 作者:行者123 更新时间:2023-11-30 00:57:15 25 4
gpt4 key购买 nike

给定一个像这样初始化的对象:

Base* a = new Derived();
Container<Base> c(a);

在哪里

class Base {
...
protected:
~Base();
}

class Derived : public Base {...};

template <typename T>
class Container {
private:
T* object;

public:
Container(T* o) : object(o) {}
void deleteObject() {
delete object; // Object must be casted to (unknown) derived type to call destructor.
}
};

显然,这与实际代码相比非常简化,但问题是我如何将 object 从其模板类型转换为其实际的派生类型(如果它们不同),这是未知的?

我不能修改 BaseDerived,甚至不能修改任何调用 Container 的代码,只能修改 Container类本身。

最佳答案

您需要对构造函数进行模板化并存储一个类型删除的删除器。 shared_ptr 就是这样做的。

template <typename T>
class Container {
private:
T* object;
std::function<void(T*)> deleter;
public:
template<typename U> Container(U* o) : object(o) {
deleter = [](T* ptr) { delete static_cast<U*>(ptr); };
}
void deleteObject() {
deleter(object);
}
};

关于c++ - 从基类转换为未知的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8541571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com