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());