【发布时间】:2012-07-11 14:20:46
【问题描述】:
在使用了几年的 Python 之后,我又回到了 C++,并且遇到了强类型的墙。我认为我对基类和派生类的指针之间的基本多态性和类型转换(例如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>()吗?
【问题讨论】:
-
感谢大家提供有用的参考资料和示例。现在绝对是有道理的,我将不得不考虑如何优雅地做到这一点,同时保持强类型 ala C++。
标签: c++ pointers polymorphism