【发布时间】:2020-08-18 02:14:50
【问题描述】:
假设你有一堂课
class Foo
{
// stuff
};
你有那个类的派生版本
class Bar : public Foo
{
// extra stuff
};
你有一个类,其中包含指向Foos 的指针向量。
class FooManager
{
public:
std::vector<Foo*> objects;
}
您能否将FooManager 派生为BarManager,其中BarManager 有一个指向Bar 的指针向量?
如果你做了类似的事情
class BarManager : public FooManager
{
std::vector<Bar*> objects;
}
然后BarManager 将只是隐藏FooManager 的对象,我不想要那个额外的成员。我可以将Bar 指针推入FooManager 的对象中,这样就可以了,但是如果我想使用extra stuff 和Bar 对象,我需要转换所有Foo*s进入Bar*s 然后如果我不小心将Foo 指针推入对象中就会出现问题。
有没有更好的解决方案?
编辑: 我正在尝试不同的方法来组织游戏的课程。所有对象都从具有纯虚拟 Update() 和 Draw() 方法的 GameObject 派生。所有对象都属于该对象类型的管理器,然后所有这些管理器都属于一个“管理器管理器”,该管理器将为管理器调用 Update() 和 Draw() 方法,这些管理器依次调用 Update() 和 Draw()对象的方法。
【问题讨论】:
-
不,你不能那样做。 C++ 不能以这种方式工作。此外,仅仅因为
Bar是Foo的子类并不意味着std::vector<Bar*>是std::vector<Foo*>的子类。 C++ 模板不能以这种方式工作。这两个向量是完全不同的类型,彼此之间没有任何关系。 -
所以我唯一的选择是在
BarManager中声明objects并隐藏FooManager的objects? -
不,
FooManager的向量可以很好地存储指向Bars 的指针。而且您不需要“将所有 Foos 转换为 Bars”,因为这正是虚拟方法的用途。虚拟继承是专为此用例设计的 C++ 强大的基础部分之一。你的 C++ 书应该有很多关于如何定义和实现虚方法的例子。 -
我需要在
Foo有一个名为a的成员和Bar有一个名为b的成员的情况下进行转换(这就是我所说的额外内容),并且我想从BarManager访问b。任何人,您可以将评论变成答案,以便我接受。 -
XY 问题。为什么需要它?
标签: c++ inheritance vector