首页 > 解决方案 > C++ 继承覆盖向量成员变量

问题描述

假设你有一堂课

class Foo
{
  // stuff
};

你有那个类的派生版本

class Bar : public Foo
{
  // extra stuff
};

你有一个带有指向Foos 的指针向量的类。

class FooManager
{
public:
  std::vector<Foo*> objects;
}

你能推导出FooManager哪里BarManagerBarManager一个指针向量Bar吗?

如果你做了类似的事情

class BarManager : public FooManager
{
  std::vector<Bar*> objects;
}

然后BarManager只是隐藏FooManager的对象,我不想要那个额外的成员。我可以将Bar指针推入FooManager's 对象,这样就可以了,但是如果我想使用extra stuffBar对象,我需要将所有Foo*s 转换为Bar*s ,然后如果我不小心将Foo指针推入,就会出现问题对象。

有更好的解决方案吗?

编辑:我正在尝试不同的方法来组织游戏的课程。所有对象都从具有纯虚拟 Update() 和 Draw() 方法的 GameObject 派生。所有对象都属于该对象类型的管理器,然后所有这些管理器都属于一个“管理器管理器”,该管理器将为管理器调用 Update() 和 Draw() 方法,这些管理器依次调用 Update() 和 Draw()对象的方法。

标签: c++inheritancevector

解决方案


不,那是不可能的。

正如一位用户指出的那样,它看起来像是一个 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;
}

推荐阅读