不同类的链表,如何用指针访问特定的类函数?

时间:2015-05-10 15:42:48

标签: c++ inheritance linked-list

好的,我有一份人事链表。但是,我可以在列表中添加人员,员工,教师或学生,因为其他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

1 个答案:

答案 0 :(得分:2)

您应该使用指向Personnel的指针来控制其他实体(子)。现在你正在做相反的事情,编译器告诉你右边(Personnel*)无法转换为Student*。那是因为无法隐式地进行下击。一般来说,DerivedBase,因此您可以隐式地从Derived*转换为Base*(向上转换),但不能转换为另一种方式。

参见例如this tutorial了解有关上/下投射的更多信息。

编辑如果您知道Personel*指针指向Student,那么您可以使用dynamic_cast<Student*>(your_pointer)访问您的Student功能宾语。但是,演员阵容通常是不完美设计的标志,你应该尽量避免使用它们。特别是,您如何知道列表中对象的动态类型(假设您已经通过其他函数填充了列表)?你可以使用RTTI(测试typeid结果然后dynamic_cast - ing),但这不仅是痛苦而且不是真正的推荐。最好是实现一个通用的虚拟接口,让编译器处理在运行时选择正确的虚函数。