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
。啊,好的,谢谢。有时候它就是这么简单=)现在可以正常工作了