我有一个对象,它作为基类的 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。
那我该怎么办呢?
最佳答案
从
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;
};
关于c++ - 如何从指向基类的唯一指针获取子类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28505409/