如果对象是类型,则C 不承担某些功能
C++ Disallowing certain functions if object is of a type
我有一个奇怪的生活问题:
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
,但在这种特殊情况下,听起来像是最后一分钟的决策 ...
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 功能原型的目的
- 如果对象是类型,则C 不承担某些功能