gpt4 book ai didi

c++ - 为什么我们不能在编译时查找指向的对象的类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:48:07 27 4
gpt4 key购买 nike

我正在尝试理解 C++ 中的虚函数。

struct B {
int f() { return 1;}
}

struct D : B {
int f() { return 1;}
}

在主函数中:

B* b = new D;
b.f()

我的理解是基类和派生类之间存在“竞争”:它们都有一个同名同签名的函数。当调用 b.f() 时,只会选择其中一个。在虚拟案例中:

  • 根据b所指向的对象的类型来选择获胜者
  • 该选择是在运行时做出的

在非虚拟情况下:

  • 根据指针b的类型选择获胜者
  • 该选择是在编译时做出的

我不明白这之间的因果关系

  1. virtual 关键字的使用
  2. 查找b指向的对象类型的能力
  3. 编译时间与运行时间

例如,为什么我们不能在编译时执行 (2)?

最佳答案

经常有编译时无法知道类型的情况。例如,考虑一个游戏,其中您有一些物理对象(实体)并且每个对象在接触时可能表现不同。例如

struct Entity {
int x,y,w,h;
virtual void onPlayerContact() {}
};

struct ExitDoor : Entity {
void onPlayerContact() { exitLevel(); }
};

struct Monster : Entity {
void onPlayerContact() { diePlayer(); }
};

//...

现在您将所有现有实体保存在一个大列表中,并且在每一帧中,您都遍历该列表,检查您的玩家是否与该实体有联系,如果有,您调用 onPlayerContact。即:

static std::set<Entity*> entities;
static Player* player;

void frame() {
for(Entity* entity : entities) {
if(player->contacts(entity))
entity->onPlayerContact(); // it's only known at runtime what to call here
}
}

关于c++ - 为什么我们不能在编译时查找指向的对象的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19488659/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com