通过c ++中的父类访问子类的元素?

时间:2013-05-18 09:26:12

标签: c++ class

class game_list
{
    public:
        string name;
        float price;
        string platform;
        string console;
        string condition;
        bool is_portable;
        string N_bits;

};

class catridge_object:public game_list
{
    string N_bits;
    bool is_import;
};

class disk_object:public game_list
{
    string disk_type;
    int n_disk;
};

class digital_object:public game_list
{
    float file_size;
    bool is_for_pc;
};

game_list *pointerMain;

int main()
{
    int optionChosen=0;
    vector<game_list*> mainVector;

}

这里game_list是父类,并且有从它派生的子类。我正在尝试创建向量game_class将包含的mainVector个对象列表。现在,根据用户输入,向量中的所有对象将具有game_list类中描述的公共属性,并且还取决于用户选择的内容,它将具有来自其他3个子类的附加信息。父类。因此,我将使用以下命令

创建dynamic game_list
pointerMain=new game_list;

一切似乎都没问题,但问题是当我尝试使用pointerMain->(any member of the child class)访问子类时,它不会那样工作。关于该怎么做的任何想法?

3 个答案:

答案 0 :(得分:1)

您需要将pointerMain强制转换为派生类类型。

catridge_object* obj = dynamic_cast<catridge_object*>(pointerMain);
if (obj)
  obj->members_of_catridge_object...

此外,基类应该是多态的,因此您需要在基类中添加至少一个虚方法(最好的选择是析构函数成员)。

或(对于某些演员表):

static_cast<catridge_object*>(pointerMain)->members_of_catridge_object...;

如果pointerMainnew catridge_object做出,请注意它是否有效,否则行为未定义。

答案 1 :(得分:0)

并非每个子类都具有相同的成员,因此要访问它们,您需要知道实际类型。将虚拟析构函数添加到基类并使用dynamic_cast或将需要这些属性的功能放入虚函数(在基类中声明并由子项实现)

正如其他人指出的那样new game_list将创建一个game_list类型的对象,而不是其中一个子类。

如果您确实选择转到RTTI(dynamic_cast)路由,请务必检查它是否返回非空指针(如果转换类型不匹配则会返回)

答案 2 :(得分:0)

可以将基指针强制转换为派生类型的指针,以通过基指针访问派生类的成员。例如,以下代码在C ++中有效,

((disk_object *)pointerMain)->n_disk=10;