如何使用基类和派生类
创建链接列表例如:
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;
}
我的做法不起作用!有什么建议吗?
答案 0 :(得分:1)
夫妻问题:
可能比检查typeid更好的解决方案是定义一个返回字符串表示形式并在Derived中覆盖它的虚函数。
答案 1 :(得分:0)
不要使用继承这种情况不要求它。你需要知道 Vertex和Super Vertex之间的区别。如果继承是正确的做法,你不需要知道差异。尝试以下方法。
class SuperNode;
class Base {
public:
int id;
Base *next;
SuperNode* next;
};
class SuperNode {
public:
string name;
int id;
Base *next;
SuperNode* next;
};
答案 2 :(得分: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
虚拟成员才能工作。