好的,我有一个人员链接列表。但是,我可以向列表中添加人员、雇员、教职人员或学生,因为其他 3 个是子类。
教师指导:“添加一个子菜单项和相关功能(插入书籍),以允许将新书添加到现有学生节点的书籍树中。新书必须插入到正确的位置以维护二叉搜索树功能,必须输入学生姓名、书名、url等信息。为了简化程序,可以假设链表中的所有节点都是Student节点。
^^ ** 我想指出,我看到她说要简化,假设所有链表都是学生节点,但人员/员工/教师和链表的所有代码都在作业中提供。因此,我能想到的“使用”的唯一方法是遍历所有代码,任何更改从人员到学生的任何引用,但这在那时似乎是一个相当愚蠢的作业......
所以我的问题:我需要遍历链接列表,直到仅使用名称字段找到正确的条目。但随后我需要编辑与该条目关联的 BookTree 类,只有子类 Student 拥有该类。由于与人员的类型不匹配,我无法使用学生指针循环遍历链表(尽管该列表除了学生之外没有任何内容),但如果我使用人员指针找到它,我当然会赢无法访问学生特定功能来编辑我需要的内容。
我尝试过 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
最佳答案
您应该使用指向 Personnel
的指针控制其他实体(子实体)。现在您正在做相反的事情,编译器告诉您右侧( Personnel*
)无法转换为 Student*
。 。这是因为隐式向下转换是不可能的。一般来说,Derived
是 Base
,因此您可以从 Derived*
隐式转换至Base*
(向上转换),但不是相反。
参见例如this tutorial有关向上/向下转换的更多信息。
编辑如果您知道您的Personel*
指针指向Student
,那么您可以使用 dynamic_cast<Student*>(your_pointer)
访问Student
你的对象的特征。然而,强制转换通常是设计不完美的标志,您应该尽量避免它们。特别是,您如何知道列表中对象的动态类型是什么(假设您获得的列表已由其他函数填充)?您可以使用 RTTI(测试 typeid
结果,然后 dynamic_cast
-ing),但这不仅仅是痛苦,而且并不真正推荐。最好实现一个通用的虚拟接口(interface)并让编译器在运行时选择正确的虚拟函数。
关于c++ - 不同类的链表,如何用指针访问具体的类函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153319/