我们有一个基类......
class Node
{
public:
std::string Name;
Node(){};
~Node(){};
}
Filter 是Node 的派生类。 Filter 与节点相同,只是它具有“filterId”属性并且它的构造函数填充 Node.Name='Filter'。
class Filter: public Node
{
public:
int filterId;
Filter() : Node()
{
Name="Filter";
}
}
我有一个返回 std::shared_ptr<Node>
的 ClassFactory当传递一个字符串时
请通过此链接在 CodeProject 上找到该工厂的代码。
http://www.codeproject.com/Articles/567242/AplusC-b-bplusObjectplusFactory .
代码似乎实例化了一个Filter,但是返回了一个Node。即对象切片。
std::shared_ptr<Node> n = std::make_shared(Node); // As expected, doesn't not have filter ID and node.Name is blank.
std::shared_ptr<Filter> f = std::make_shared(Filter); // As expected, has filterID and node.Name is 'Filter'.
现在我想处理一个 std::shared_ptr(Node) 数组,它实际上可能包含 std::shared_ptr(Filter),具体取决于从工厂请求的类。
std::shared_ptr<Node> nf = std::make_shared(Filter); // Error. Does not have filterId, but does have **Node**.Name='Filter'.
我什至尝试了更简单的情况......并遇到了同样的问题。
Node n = Node();
Filter f = Filter();
Node nf =Filter(); // Error, nf does not have a filterID, but it's Name field is set to 'Filter'.
我在这里做错了什么? Node 是我所有派生类的基类。当我有一个接受Node 的函数时,我应该能够向它发送一个Filter 并使 filterId 可用。
在这种情况下,建议使用指针来提供帮助,但是随着事情的发展,shared_ptr 是一个指针。
最佳答案
Node
对派生类可能定义的附加数据成员和函数一无所知。所以你需要检索一个 shared_ptr<Filter>
能够访问filterId
.使用 std::dynamic_pointer_cast
做这个。
std::shared_ptr<Node> n = ...
auto f = std::dynamic_pointer_cast<Filter>(n);
if(f) {
// The managed object is a Filter
std::cout << f->filter_id << '\n';
}
如果你知道 n
始终包含 Filter
(或派生自 Filter
的东西),您可以使用 std::static_pointer_cast
相反。
关于c++ - std::shared_ptr 类工厂 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903347/