【发布时间】:2014-11-12 05:51:18
【问题描述】:
我们有一个基类.....
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";
}
}
我有一个 ClassFactory,它在传递字符串时返回 std::shared_ptr<Node>
请通过此链接在 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 会变得很尖。
【问题讨论】:
-
boost 有 shared_dynamic_cast
标签: c++ inheritance c++11 shared-ptr factory-pattern