可能的重复:
派生** 到基础** 之间的转换 https://stackoverflow.com/questions/8026040/conversion-between-derived-to-base
在主要使用 Python 几年之后,我又回到了 C++,并且遇到了强类型的墙。我认为我很好地掌握了基类和派生类指针之间的基本多态性和类型转换(例如派生类的指针可以类型转换为其基类的指针吗? https://stackoverflow.com/questions/2156064/can-a-pointer-of-a-derived-class-be-type-cast-to-the-pointer-of-its-base-class),但这里有一个难题:为什么我不能将指向派生类的指针分配给它的基类的 p-to-p 指针?
对于更多的上下文(也许还有关于不那么Python地执行此操作的提示),这里是我正在尝试做的事情的简化版本。我想要一个指向对象的指针列表(从单个类派生)和一个标识它们的字符串(即map<string, obj*>
)。然后,一组组件将传递一个标识字符串和位置的列表,以存储指向相应对象的指针(即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>()
到处?
您正在丢失能够投射的必要信息base *
to a derived *
.
考虑以下情况derived
继承自多个基类,因此强制转换需要调整指针值。然后derived *pd = static_cast<derived *>(pb)
对于指向基址的指针pb
将自动应用指针调整。
However derived *pd; base **ppb = &pd; *ppb = *pb
将无法应用指针调整,因此这是不合法的。
你应该做的是:
base *b_ptr;
... // existing code
derived *d_ptr = static_cast<derived *>(b_ptr);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)