我有一个对象,它在地图中存储为基类的unique_ptr。
class Base
{
int foo;
};
map <string, unique_ptr<Base> > Objects;
但是,对象实际上是不同的子类。
class Child1 : public Base
{
int bar1;
};
class Child2 : public Base;
{
int bar2;
};
Objects.insert(make_pair("Child1", unique_ptr<Base>(new Child1())));
Objects.insert(make_pair("Child2", unique_ptr<Base>(new Child2())));
现在,在代码中的某个地方,我想访问Child1的成员变量,该变量对于该类是唯一的。
cout << "Bar1 is:" << Objects["Child1"]->bar1 << endl;
但我收到错误:
ERROR: 'class Base' has no member 'bar1'
所以我尝试使用dynamic_cast,但当然,你不能在unique_ptr上使用dynamic_cast。
那我该怎么办?
答案 0 :(得分:3)
从unique_ptr
获取指向基类的指针。
Base* basePtr = Objects["Child1"].get();
在指针上执行dynamic_cast
。
Child1* child1Ptr = dynamic_cast<Child1*>(basePtr);
访问Child1
类的成员。
if ( child1Ptr != nullptr )
{
// ... Use child1Ptr
}
确保您创建基类virtual
的析构函数。否则,当unique_ptr
被破坏时,永远不会调用派生类的析构函数。另外,正如@AndyG在评论中观察到的那样,dynamic_cast
在没有任何虚函数的情况下无法工作。
class Base
{
public:
virtual ~Base(){}
private:
int foo;
};