好的,我有一份人事链表。但是,我可以在列表中添加人员,员工,教师或学生,因为其他3个是子类。
教师指导:“添加子菜单项和相关功能(插入书籍),以允许将新书添加到现有学生节点的书籍树中。必须将新书插入正确的位置以维护二进制搜索树功能。必须输入学生姓名,书名和网址的信息。对于简单的程序,您可以假设链表中的所有节点都是学生节点。
^^ **我想指出,我看到她说要简化的地方假设所有链接列表都是学生节点,但是Personnel / Employee / Faculty的所有代码和链接列表都在分配中提供。所以,我能想到的“使用”的唯一方法就是通过所有代码来改变从人员到学生的任何参考,但那时候这似乎是一个相当愚蠢的任务......
所以我的问题:我需要浏览链表,直到找到只使用名称字段的正确条目。但是我需要编辑与该条目绑定的BookTree类,该类只有Student类具有的子类。我不能用学生指针遍历链表(虽然,列表中没有学生以外的任何东西),因为类型不匹配w / Personnel,但如果我通过使用Personnel指针找到它,当然,赢了无法访问学生特定的功能来编辑我需要的内容。
我已经尝试过Student * ptr =& PersonnelPtr,在我找到正确的地址后没有骰子给它分配地址。
代码:
int add_book()
{
char studentName[50]; // blah
PersonnelNode *temp, *prev;
Student *student;
temp = head;
prev = temp;
while (temp != NULL)
{
student = temp->getNode(); // this line gives "value of type Personnel* cannot be assigned to an entity of type Student*
if (_stricmp(studentName, student->getName()) != 0)
{
prev = temp; // loop through
temp = temp->getNext();
index++;
}
else
{
// Do Stuff
// More importantly in the do stuff part I need access to Student-specific data/functions that Personnel pointer won't see
答案 0 :(得分:2)
您应该使用指向Personnel
的指针来控制其他实体(子)。现在你正在做相反的事情,编译器告诉你右边(Personnel*
)无法转换为Student*
。那是因为无法隐式地进行下击。一般来说,Derived
是Base
,因此您可以隐式地从Derived*
转换为Base*
(向上转换),但不能转换为另一种方式。
参见例如this tutorial了解有关上/下投射的更多信息。
编辑如果您知道Personel*
指针指向Student
,那么您可以使用dynamic_cast<Student*>(your_pointer)
访问您的Student
功能宾语。但是,演员阵容通常是不完美设计的标志,你应该尽量避免使用它们。特别是,您如何知道列表中对象的动态类型(假设您已经通过其他函数填充了列表)?你可以使用RTTI(测试typeid
结果然后dynamic_cast
- ing),但这不仅是痛苦而且不是真正的推荐。最好是实现一个通用的虚拟接口,让编译器处理在运行时选择正确的虚函数。