Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;继承重写向量成员变量_C++_Inheritance_Vector - Fatal编程技术网

C++ C++;继承重写向量成员变量

C++ C++;继承重写向量成员变量,c++,inheritance,vector,C++,Inheritance,Vector,说你上过课 class-Foo { //东西 }; 你有这个类的派生版本 类栏:公共Foo { //额外的东西 }; 你有一个类,它有一个指向Foos的指针向量 类管理器 { 公众: 向量对象; } 您能否将FooManager导出到BarManager中,其中BarManager具有指向Bar的指针向量 如果你做了类似的事情 class BarManager:公共FooManager { 向量对象; } 然后,BarManager将只是隐藏FooManager的对象,我不想要那个额外的

说你上过课

class-Foo
{
//东西
};
你有这个类的派生版本

类栏:公共Foo
{
//额外的东西
};
你有一个类,它有一个指向
Foo
s的指针向量

类管理器
{
公众:
向量对象;
}
您能否将
FooManager
导出到
BarManager
中,其中
BarManager
具有指向
Bar
的指针向量

如果你做了类似的事情

class BarManager:公共FooManager
{
向量对象;
}
然后,
BarManager
将只是隐藏
FooManager
的对象,我不想要那个额外的成员。我可以将
Bar
指针推入
FooManager
的对象中,这样就行了,但是如果我想使用
额外的东西
Bar
对象,我需要将所有的
Foo*
s强制转换为
Bar*
s,如果我不小心将
Foo
指针推入对象,就会出现问题

有更好的解决办法吗

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

不,这是不可能的

正如一位用户指出的,这看起来像是一个XY问题。你应该更好地解释你想要实现什么

只给出了很少的解释

一种解决方案是使用
std::vector对象FooManager
BarManager
中的code>具有获取
对象
并将
对象
中的指针强制转换为
Bar*
的函数

class BarManager : public FooManager {
    Bar* get_at_index(std::size_t i) const { return static_cast<Bar*>(objects[i]); }
}
class BarManager:公共FooManager{
Bar*get_at_index(std::size_ti)const{return static_cast(objects[i])}
}
另一种方法是使用模板类,然后使用
Manager-mgr
经理

template <class T>
class Manager
{
public:
  std::vector<T*> objects;
}
模板
班级经理
{
公众:
向量对象;
}

这样做不仅不可能,而且毫无意义。伊玛盖恩如果你能这样做会发生什么。如果允许这样做:

class BarManager : public FooManager
{
  override std::vector<Bar*> objects;  // replace the base class member with this
}
您可以将
BarManagar*
转换为
FooManager*

FooManager *ptr = &SomeBarManager;
然后在数据中插入一个Baz

ptr->objects->push_back(new Baz());
当后来有人试图像进入酒吧一样进入时,会导致可预见的混乱


所以真正的问题是你为什么想做这样的事情?因为它真的没有任何意义,如果您认为它有意义,那么您的设计中可能存在一些根本不一致的地方。

不,您不能这样做。C++不这样工作。此外,仅仅因为
Bar
Foo
的子类并不意味着
std::vector
std::vector
的子类。C++模板不能这样工作。这两个向量是完全不同的类型,彼此之间没有任何关联。因此,我唯一的选择是在
BarManager
中声明
对象
,并隐藏
FooManager
对象
?不,
FooManager
的向量可以很好地用于存储指向
Bar
的指针。而且您不需要“将所有的foo强制转换为条”,因为这正是虚拟方法的用途。虚拟继承是C++的一个强大的基本部分,它是为这个用例设计的。您的C++书籍应该有很多定义和实现虚拟方法的例子。我需要在“代码> Foo<代码>的情况下进行转换,它有一个名为<代码> A/<代码>和<代码> Bar <代码>的成员,名为 B>代码>(这是我的额外含义),我想从<代码> BarManager < /C> > <代码> B<代码>。不管是谁,你都可以把评论变成答案,这样我就可以接受了。为什么需要这样做?我相信C++ 20中的新概念和约束以及模板是我所要寻找的。
ptr->objects->push_back(new Baz());