1

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

假设我有以下课程:

class Control
{
    //virtual stuff..
};

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

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

因此 Button 和 CheckBox 是同一个母控件的姐妹。

现在假设像 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.

如何判断 Array 包含哪些数据类型?我怎么知道 ListOfControls[0] 拥有一个 Button 而 ListOfControls[1] 拥有一个 CheckBox?我读到您很可能必须进行动态转换,如果它不返回 null,那就是特定的数据类型:

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; //???
4

1 回答 1

3

由于切片,您不能拥有多态对象的容器;你需要有一个指向多态对象的指针的容器。不过,您是对的;您必须使用dynamic_casttypeid获取数组包含指针的对象的运行时类型。

但是,您应该尝试编写不依赖于多态对象的真实类型的代码;您应该概括基类中的接口,只需在指针上调用这些成员函数。这使您的代码简洁,更可扩展,只需对现有代码进行最少的修改。

于 2013-03-10T22:50:34.097 回答