c++ - 不同类的链表,如何用指针访问具体的类函数?

标签 c++ inheritance linked-list

好的,我有一个人员链接列表。但是,我可以向列表中添加人员、雇员、教职人员或学生,因为其他 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* 。 。这是因为隐式向下转换是不可能的。一般来说,DerivedBase ,因此您可以从 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/

相关文章:

C++ 检查参数是否为动态数组。有必要吗?

c++ - 手写数字/数字识别

Java - 为什么另一个包中的子级无法通过父级引用访问父级的 protected 方法?

JavaScript继承: How can we inherit object and function where object is created from function using new operator and has prototype functions

c++ - C++ 中的继承成员函数如何处理子成员变量?

C - 将结构指针与整数指针传递给函数

c++ - ChangeDisplaySettingsEx() 总是返回 DISP_CHANGE_BADPARAM

c++ - C++ 内存泄漏会对 CPU 使用率产生负面影响吗?

python - 在 python 中使用链表实现堆栈。 pop 方法的问题和有关可变性的问题

c++ - C++循环链表的递归基本情况