1
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),它不起作用。关于做什么的任何想法?

4

3 回答 3

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...;

请注意,如果pointerMain由 制作,它会起作用new catridge_object,否则行为是未定义的。

于 2013-05-18T09:33:43.390 回答
0

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

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

如果您确实选择了 RTTI ( dynamic_cast) 路线,请务必检查它是否返回一个非 Null 指针(如果转换类型不匹配,它将返回)

于 2013-05-18T09:34:23.280 回答
0

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

((disk_object *)pointerMain)->n_disk=10;
于 2013-05-18T09:39:26.350 回答