C++ 获取基类指针的派生类
我正在寻找一种方法,将基类指针强制转换为派生类指针,以访问其成员函数。我尝试过动态转换,但是当尝试将派生类函数打印到C++ 获取基类指针的派生类,c++,pointers,C++,Pointers,我正在寻找一种方法,将基类指针强制转换为派生类指针,以访问其成员函数。我尝试过动态转换,但是当尝试将派生类函数打印到cout时,我的程序停止工作 这是我的密码: int main() { Entity box; BoxObject box2(10, 10, 33, 2,BODYTYPE::dynamicBody); // adding my entities to my std::map g_pEntityManager->addEntity(std::m
cout
时,我的程序停止工作
这是我的密码:
int main()
{
Entity box;
BoxObject box2(10, 10, 33, 2,BODYTYPE::dynamicBody);
// adding my entities to my std::map
g_pEntityManager->addEntity(std::make_unique<Entity>(box));
g_pEntityManager->addEntity(std::make_unique<Entity>(box2));
// get Entity with Entity* as return value
// (1) is the unique id as key of my map
Entity* ent = g_pEntityManager->getEntity(1);
// casting Entity* to BoxObject* to be able to have access to derived-
// class member-functions
BoxObject* boxi = dynamic_cast<BoxObject*>(ent);
// when trying to cout public member function program crashes
std::cout << boxi->getDimension().x << std::endl;
return 0;
}
获取实体:
Entity* EntityManager::getEntity(int entityId)
{
std::map<int, std::unique_ptr<Entity>>::iterator it = m_EntityManager.find(entityId);
if (it != m_EntityManager.end())
{
if (it->second != nullptr)
{
std::cout << "GEt: " << it->second.get() << std::endl;
return it->second.get();
}
else
{
std::cout << "Pointer to object is invalid!" << std::endl;
return nullptr;
}
}
else
{
std::cout << "Couldn`t find Entity with id: " << entityId << " in EntityManager" << std::endl;
return nullptr;
}
}
Entity*EntityManager::getEntity(int-entityId)
{
std::map::iterator it=m_EntityManager.find(entityId);
if(it!=m_EntityManager.end())
{
如果(它->秒!=nullptr)
{
std::cout在创建box2
时,实际上是在创建实体的对象,如下所示:
Entity* ent = g_pEntityManager->getEntity(1);
BoxObject* boxi = dynamic_cast<BoxObject*>(ent);
g_pEntityManager->addEntity(std::make_unique(box2));
相反,如果您想要派生类的对象(BoxObject
),则需要创建这样的对象:
g_pEntityManager->addEntity(std::make_unique(box2));
然后可按如下方式使用:
Entity* ent = g_pEntityManager->getEntity(1);
BoxObject* boxi = dynamic_cast<BoxObject*>(ent);
Entity*ent=g_pEntityManager->getEntity(1);
BoxObject*boxi=动态投影(ent);
在创建box2
时,实际上是在创建实体的对象,如下所示:
Entity* ent = g_pEntityManager->getEntity(1);
BoxObject* boxi = dynamic_cast<BoxObject*>(ent);
g_pEntityManager->addEntity(std::make_unique(box2));
相反,如果您想要派生类的对象(BoxObject
),则需要创建这样的对象:
g_pEntityManager->addEntity(std::make_unique(box2));
然后可按如下方式使用:
Entity* ent = g_pEntityManager->getEntity(1);
BoxObject* boxi = dynamic_cast<BoxObject*>(ent);
Entity*ent=g_pEntityManager->getEntity(1);
BoxObject*boxi=动态投影(ent);
告诉我们你是如何插入你的std::map
如果你想使用BoxObject
你需要创建一个BoxObject
,而不是一个实体动态投射不会神奇地将一个对象转换成不同类型的obejct。我有点惊讶于动态投射YPE检查没有抛出任何错误(因为他正在向下)。也许我是错的吗?@ UBUTUTHOUDE <代码> DyrimCysCase<代码>如果代码不能执行,将返回<代码> NulLPTR < /代码>。JONANTANKPORTER谢谢。我对C++是相当新的。我相信<代码> DyrimCype Case<代码>会引发异常(<代码> BADYCAST )如果它是引用而不是指针。告诉我们你是如何插入你的std::map
如果你想使用BoxObject
你需要创建一个BoxObject
,而不是实体动态投射不会神奇地将一个对象转换成另一种对象。我有点惊讶dYunaMICKSCASTE/<代码>运行时类型检查没有抛出任何错误(因为他正在向下)。也许我是吗?@ UBUTUTHOUDE <代码> DyrimCype Case<代码>如果代码不能执行,将返回<代码> NulLPTR < /C>。我对C++是相当新的。我相信<代码> DyrimCysCase<代码>会引发异常。(bad_cast
)如果是引用而不是指针。是否可以创建不同std::make_unique的映射?例如将std::make_unique和std::make_unique放入同一映射中?不可以。std::map
中的所有键必须是同一类型的。但是,由于BoxObject
是从实体
派生的,因此,如果m_EntityManager
的密钥类型为std::unique_ptr
。啊,好的,谢谢。有时候它就这么简单=)现在可以创建不同std::make_unique的映射吗?比如将std::make_unique和std::make_unique放在同一个映射中?不可以。std::map
中的所有键都必须是相同的类型。但是由于BoxObject
是从实体
派生出来的,如果m\u EntityMana>的键是ger的类型是std::unique_ptr
。啊,好的,谢谢。有时候它就是这么简单=)现在可以正常工作了