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
是父类,并且有派生自它的子类。我正在尝试创建一个向量mainVector
将保存的game_class
对象列表。现在,根据用户输入,向量中的所有对象都将具有game_list
类中描述的公共属性,并且根据用户的选择,它将具有从父类派生的其他3个子类的附加信息。因此,我将使用以下命令创建一个dynamic
game_list
pointerMain=new game_list;
看起来一切正常,但问题是当我尝试使用pointerMain->(any member of the child class)
访问子类时,它不是这样工作的。你有什么建议吗?
发布于 2013-05-18 09:33:43
您需要将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-18 09:34:23
不是每个子类都有相同的成员,所以要访问它们,你需要知道实际的类型。要么向基类添加一个虚拟析构函数并使用dynamic_cast
,要么将需要这些属性的功能放入一个虚拟函数(在基类中声明并由子类实现)
正如其他人指出的那样,new game_list
将创建game_list
类型的对象,而不是某个子类的对象。
如果您确实选择了RTTI (dynamic_cast
)路由,请务必检查它是否返回一个非空指针(如果强制转换类型不匹配,它将返回非空指针)
发布于 2013-05-18 09:39:26
可以将基指针强制转换为派生类型的指针,以通过基指针访问派生类的成员。例如,以下代码在C++中有效,
((disk_object *)pointerMain)->n_disk=10;
https://stackoverflow.com/questions/16622666
复制