c++ - C++ 继承覆盖向量成员变量
问题描述
假设你有一堂课
class Foo
{
// stuff
};
你有那个类的派生版本
class Bar : public Foo
{
// extra stuff
};
你有一个带有指向Foo
s 的指针向量的类。
class FooManager
{
public:
std::vector<Foo*> objects;
}
你能推导出FooManager
哪里BarManager
有BarManager
一个指针向量Bar
吗?
如果你做了类似的事情
class BarManager : public FooManager
{
std::vector<Bar*> objects;
}
然后BarManager
只是隐藏FooManager
的对象,我不想要那个额外的成员。我可以将Bar
指针推入FooManager
's 对象,这样就可以了,但是如果我想使用extra stuff
该Bar
对象,我需要将所有Foo*
s 转换为Bar*
s ,然后如果我不小心将Foo
指针推入,就会出现问题对象。
有更好的解决方案吗?
编辑:我正在尝试不同的方法来组织游戏的课程。所有对象都从具有纯虚拟 Update() 和 Draw() 方法的 GameObject 派生。所有对象都属于该对象类型的管理器,然后所有这些管理器都属于一个“管理器管理器”,该管理器将为管理器调用 Update() 和 Draw() 方法,这些管理器依次调用 Update() 和 Draw()对象的方法。
解决方案
不,那是不可能的。
正如一位用户指出的那样,它看起来像是一个 XY 问题。你应该更好地解释你想要达到的目标。
只给出了几个解释......
一种解决方案是使用std::vector<Foo*> objects;
inFooManager
和 inBarManager
具有objects
将指针objects
转换为Bar*
.
class BarManager : public FooManager {
Bar* get_at_index(std::size_t i) const { return static_cast<Bar*>(objects[i]); }
}
另一种方法是使用模板类,然后使用Manager<Foo> mgr;
或Manager<Bar> mgr;
。
template <class T>
class Manager
{
public:
std::vector<T*> objects;
}
推荐阅读
- css - 如何使用 PostCSS 在 Vue 中导入全局 CSS?
- android - 在 android studio 中出现以下错误:程序类型已存在:com.google.api.AuthProto
- javascript - 使用 mongoose 在 expressj 中验证 OTP
- javascript - Angular 5 UI 和 node.js 服务器使用护照包进行谷歌 OAuth 登录的 CORS 问题
- android - 将 Scrollview 隐藏在 Imageview 后面,反之亦然
- android - 如何在 Google Maps API 中调整地点的搜索半径?
- azure - Azure ML Studio 中回归神经网络的激活功能?
- python - 压缩长向量由0和1组成
- jquery - 当这个函数里面有带有':'的代码时,它会做什么?
- javascript - sahi:如何在 javascript 中使用转义字符