可能重复:
派生**到基础**之间的转换
在主要使用 Python 的几年之后,我又回到了 C++,并且遇到了一堵强类型的墙。我认为我对基类和派生类的指针之间的基本多态性和类型转换有很好的处理(例如,派生类的指针可以类型转换为其基类的指针吗?),但这里有一个难点:为什么可以我不是将一个指向派生类的指针分配给一个指向它的基类的 p-to-p 的指针吗?
对于更多的上下文(也许还有关于减少pythonish的提示),这是我正在尝试做的简化版本。我想要一个指向对象的指针列表(从单个类派生)和一个标识它们的字符串(即 a map<string, obj*>
)。然后,一组组件将传递标识字符串和位置的列表,以存储指向相应对象(即 a map<string, obj**>
)的指针。然后我应该能够通过其字符串 id 找到适当的对象,并填写适当的指针以供组件后续使用。执行此操作的简化代码是
#include <map>
#include <string>
using namespace std;
class base
{
};
class derived: public base
{
};
typedef map<string, base**> BasePtrDict;
typedef map<string, base*> BaseDict;
int main(int argc, char* argv[])
{
base b1, b2;
derived d;
derived* d_ptr;
BaseDict base_dict;
base_dict["b1"] = &b1;
base_dict.insert(make_pair("b2",&b2)); // alternate syntax
base_dict["d"]= &d;
BasePtrDict ptr_dict;
ptr_dict["d"] = &d_ptr;
for (auto b = ptr_dict.begin(); b != ptr_dict.end(); b++)
*(b->second) = base_dict[b->first];
return 0;
}
这会在ptr_dict["d"] = &d_ptr;
. 为什么?在 C++ 范式中,我应该做什么?我真的需要reinterpret_cast<base>()
到处做丑陋的(不安全的?)吗?