C++ 多态数组找出其中的子元素

C++ 多态数组找出其中的子元素,c++,polymorphism,C++,Polymorphism,这只是为了学习,因为我似乎在其他任何地方都找不到这样的答案。。 所以我有很多问题。。我不会做这样的事,但我只是想知道,因为我的大脑需要我知道,否则我一天剩下的时间都会感到不舒服 假设我有以下课程: class Control { //virtual stuff.. }; class Button : public Control { //More virtual stuff.. }; class CheckBox : public Control { //More v

这只是为了学习,因为我似乎在其他任何地方都找不到这样的答案。。 所以我有很多问题。。我不会做这样的事,但我只是想知道,因为我的大脑需要我知道,否则我一天剩下的时间都会感到不舒服

假设我有以下课程:

class Control
{
    //virtual stuff..
};

class Button : public Control
{
    //More virtual stuff..
};

class CheckBox : public Control
{
    //More virtual stuff..
};
因此,按钮和复选框是同一个母控件的姐妹

现在假设像moi这样好奇的人看到这样的东西:

std::vector<Control> ListOfControls;    //Polymorphic Array.
ListOfControls.push_back(Button());     //Add Button to the Array.
ListOfControls.push_back(CheckBox());   //Add CheckBox to the Array.

您不能拥有多态对象的容器,因为;您需要有一个指向多态对象的某种指针的容器。不过,你是对的;您必须使用
dynamic\u cast
typeid
获取数组包含指针的对象的运行时类型


但是,您应该尝试编写不依赖于多态对象的实际类型的代码;您应该在基类中泛化接口,只需在指针上调用这些成员函数。这使得您的代码更干净,更具可扩展性,只需对现有代码进行最小的修改。

:S但我编译了上面的代码,它没有抱怨。。什么是切片?有链接吗?TypeID似乎说它们都是“7Control”@CantChooseServerNames是的,一个非常好的链接:@CantChooseServerNames是的,你说得对:TypeID似乎说它们都是Control。这就是切片的效果;派生类中的所有信息都丢失了,实际上您只有一个纯
控件的向量,它下面没有任何派生类的实例。另一方面,
typeid
发生在编译时,除非您在指针或多态类型引用上使用它。哇!哦,伙计。。没想到。在Java和C#中如何不发生这种情况?你知道:对象O=新的整数(9);这在java中是有效的,为什么?当计时器用完时,我会接受你的回答。但是您所说的“应该在基类中泛化接口,只调用指针上的那些成员函数”是什么意思呢?@CantChooseUsernames,因为在Java中,
Object
实际上是指针,而不是值。在C++中,如果你创建一个名为对象< /C> >的类,对象O意味着你为对象分配了一定数量的内存,并且内存位置的名称为“代码> O< /CODE >,因此你必须确切地知道内存中会发生什么。这就是切片发生的原因;基类有一定的内存,而派生类无法放入该内存,因为它们可能有额外的信息。但是,由于所有类型的指针占用相同的内存量,因此可以使用指针容器。
if (dynamic_cast<Button*>(ListOfControls[0]) == ???) //I got lost.. :(
std::vector<void*> ListOfControls;          //Polymorphic Array through Pointer.
ListOfControls.push_back(new Button());     //Add Button to the Array.
ListOfControls.push_back(new CheckBox());   //Add CheckBox to the Array.
Button Btn;
Control Cn;

Btn = (Button) Cn; //???