我被告知基类指针可以指向该基类的任何派生类型。但是,我需要访问此派生类,即使该参数正在调用指向基类的指针。
此处Meeting
是派生类型,ListItem
是基本类型,CompareByInsertKey
是由Meeting::CompareByInsertKey
覆盖的ListItem中的强制纯虚函数,Meeting
}有一个名为thisdate
的结构,其成员为year
。在这种情况下,item_in_list将是一个会议类型,但显然指针仍然有效,即使它是派生类型。
int Meeting::CompareByInsertKey(ListItem* item_in_list)
{
int compare = (*item_in_list).thisdate.year;
return compare;
}
如何允许此方法接受派生或基类参数并允许它使用派生类成员?
换句话说,我需要在派生类型的方法中访问派生类型的私有成员。问题是CompareByInsertKey
函数必须采用基类指针才能覆盖纯virtual ListItem::CompareByInsertKey
谢谢, 如果您需要更多信息,请告诉我
答案 0 :(得分:2)
您应该使用dynamic_cast
,如下所示:
int Meeting::CompareByInsertKey(ListItem* item_in_list)
{
Meeting *meeting = dynamic_cast<Meeting*>(item_in_list);
// dynamic_cast returns a null pointer if the passed pointer is not
// of the requested type
if(meeting == 0) {
...
}
int compare = meeting->thisdate.year;
return compare;
}
答案 1 :(得分:0)
今天你设置它的方式,我能看到的唯一方法是使用dynamic_cast
进行类型检查和转换。这可确保不传入不匹配的类型。
int Meeting::CompareByInsertKey(ListItem* item_in_list)
{
Meeting* meeting = dynamic_cast<Meeting*>(item_in_list);
if(NULL != meeting)
{
int compare = meeting->thisdate.year;
return compare;
)
else // return error value
}