如果对象是类型,则C 不承担某些功能

C++ Disallowing certain functions if object is of a type

本文关键字:承担 功能 对象 类型 如果      更新时间:2023-10-16

我有一个奇怪的生活问题:

Entity* Bob = new Camera其中实体(摘要)是我在向量数组中想要的一种对象。相机是特定的对象。

我没有问题来继承和将实体的功能在相机中实现。相机运行良好。当我用Entity* Joe = new Cube;

创建另一个对象时,出现了问题

现在,我想能够将乔和鲍勃分组在一起,但是鲍勃(Bob)是一个移动的对象,我希望他继承ProcessKeyboard();功能,以便在使用BOB时可以使用它。但是乔不动,所以我宁愿乔甚至无法访问ProcessKeyboard();功能。

现在,我可以使Joe的ProcessKeyboard功能无能为力,但是我宁愿编译器不允许我将其作为Joe做的选择。

我认为我的主要问题是我应该寻找什么来解决这个问题?

我相信最合乎逻辑的解决方案是:

class Entity
{
   virtual void Update() = 0;
}
class Camera : public Entity
{
   void Update() override {
      // ...
   }
   void ProcessKeyboard() {
      // ...
   }  
}
class Cube : public Entity
{
   void Update() override {
       // ...
   }
}

然后您分别存储实体和相机:

vector<Entity*> entities; // pointers to all your entities are here
vector<Camera*> cameras;  // additionally track Camera objects
for(auto entity : entities) {
   entity->Update();
}
for(auto camera : cameras) {
   camera->ProcessKeyboard();
}

...我希望他继承ProcessKeyboard();功能,所以我可以使用 使用鲍勃时。

如您所见,为了使用ProcessKeyboard(),您无需继承它;另外,我必须说,由于ProcessKeyboard()不是virtual,因此不涉及其他VTABLE(仅适用于Entity),并且ProcessKeyboard()呼叫上没有vtable查找。而且很好。

但是,如果有很多不同的"可移动"对象,并且您不在乎性能... OOP式解决方案很明显:只需为可移动对象创建一个"接口"。

class IMovable
{
   virtual void ProcessKeyboard() = 0;
}
class Camera : public Entity, public IMovable
{
   void Update() override {
      // ...
   }
   void ProcessKeyboard() override {
      // ...
   }  
}

用法:

vector<Entity*> entities;  // the same approach
vector<IMovable*> movable; // additionally track all movable objects
for(auto entity : entities) {
   entity->Update();
}
for(auto object : movable) {
   object ->ProcessKeyboard();
}

除了说所有内容之外,还有一个dynamic_cast,但在这种特殊情况下,听起来像是最后一分钟的决策 ...