1

如何使用基类和派生类创建链表

例如。:

class Base { 
    int id;
    Base *next;
};
class Derived : public Base {
    string name;
};  

Base *list = NULL;

Base *b = new Base();
b->next = list;
list = b;

Derived *d = new Derived();
d->next = list;
list = d;

Base *itr = list;
while(itr) {
    if(typeid(Base) == typeid(*itr)) {
        cout << "Base: " << itr->id << endl;
    } else {
        cout << "Derived: " << itr->id << " and " << itr->name << endl;
    }
    itr = itr->next;
}

我的方法不起作用!有什么建议么?

4

3 回答 3

1

几个问题:

  • 字段是私有的
  • 您必须在 else 中转换为 Derived 才能使用 name();

可能比检查 typeid 更好的解决方案是定义一个返回字符串表示的虚函数并在 Derived 中覆盖它。

于 2013-09-03T17:44:22.097 回答
0

你想做的事情很好。请参阅此完整示例:

#include <stdio.h>
#include <typeinfo>

struct Base {
    Base *next; int id;
    Base(int id) : id(id) {}
    virtual ~Base() {}
};

struct Derived : Base {
    int id2;
    Derived(int id, int id2) : Base(id), id2(id2) {}
};

void link(Base *n, Base **list) {
    n->next = *list; *list = n;
}

int main(int argc, const char *argv[]) {
    Base *list = 0;
    link(new Base(10), &list);
    link(new Derived(20, 21), &list);
    link(new Base(30), &list);
    link(new Derived(40, 41), &list);

    for (Base *p = list; p; p=p->next) {
        if (typeid(*p) == typeid(Base))
            printf("Base(%i)\n", p->id);
        else
            printf("Derived(%i, %i)\n", p->id, ((Derived *)p)->id2);
    }
    return 0;
}

但是,您必须至少有一个虚拟成员typeid才能工作。

于 2013-09-03T19:24:56.803 回答
0

不要使用继承这种情况不需要它。您需要知道顶点和超级顶点之间的区别。如果继承是正确的做法,您将不需要知道其中的区别。尝试以下方法。

class SuperNode;
class Base {
public:
    int id;
    Base *next;
    SuperNode* next;
};

class SuperNode {
public:
    string name;
    int id;
    Base *next;
    SuperNode* next;
};
于 2013-09-03T19:13:33.653 回答