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)
访问子类时,它不会那样工作。关于该怎么做的任何想法?
答案 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...;
如果pointerMain
由new catridge_object
做出,请注意它是否有效,否则行为未定义。
答案 1 :(得分:0)
并非每个子类都具有相同的成员,因此要访问它们,您需要知道实际类型。将虚拟析构函数添加到基类并使用dynamic_cast
或将需要这些属性的功能放入虚函数(在基类中声明并由子项实现)
正如其他人指出的那样new game_list
将创建一个game_list
类型的对象,而不是其中一个子类。
如果您确实选择转到RTTI(dynamic_cast
)路由,请务必检查它是否返回非空指针(如果转换类型不匹配则会返回)
答案 2 :(得分:0)
可以将基指针强制转换为派生类型的指针,以通过基指针访问派生类的成员。例如,以下代码在C ++中有效,
((disk_object *)pointerMain)->n_disk=10;