C++ 如何使用多态性填充链表?

C++ 如何使用多态性填充链表?,c++,class,polymorphism,C++,Class,Polymorphism,我已经建立了一个由列表类和节点类组成的链表。如何用不同类的节点填充列表类?元素必须是指针(最好是智能的),以避免切片。这是我看到的唯一限制 YourList<std::unique_ptr<BaseClass> > myList; myList.add(new DerivedClassA); myList.add(new DerivedClassB); yourlistmylist; myList.add(新衍生类别A); myList.add(新衍生类别B); 如

我已经建立了一个由列表类和节点类组成的链表。如何用不同类的节点填充列表类?

元素必须是指针(最好是智能的),以避免切片。这是我看到的唯一限制

YourList<std::unique_ptr<BaseClass> > myList;

myList.add(new DerivedClassA);
myList.add(new DerivedClassB);
yourlistmylist;
myList.add(新衍生类别A);
myList.add(新衍生类别B);

如何用不同类的节点填充list类?(目前的编译时多态性,不同的对象将被放入不同的列表中)

我假设您目前有以下情况:

class Node {
public:
  Node* next;
  int datum;
  int& GetDatum() { return datum; }
};
class List {
public:
  Node* head;
  int Count();
};
int List::Count() { /* compute length */; return length; }

int main () { List a; List b; }
我想您还有其他更有用的成员函数,但这些函数足以说明这一点

您可以通过模板将上述代码转换为使用编译时多态性:

#include <string>

template<class T>
class Node {
public:
  Node* next;
  T datum;
  T& GetDatum() { return datum; }
  };
  template<class T>
  class List {
  public:
    Node<T>* head;
    int Count();
  };
  template<class T>
  int List<T>::Count() { /*...*/; return length; }
  int main () { List<int> a; List<std::string> b; return a.Count(); }
#包括
模板
类节点{
公众:
节点*下一步;
T基准;
T&GetDatum(){return datum;}
  };
模板
班级名单{
公众:
节点*头;
int Count();
  };
模板
int List::Count(){/*…*/;返回长度;}
int main(){List a;List b;返回a.Count();}

视情况而定。您是指运行时多态性(即,您希望创建异构列表)还是编译时多态性(即,您希望创建包含不同类型的多个列表,但每个列表都是同质的)?前者需要存储指针,后者需要使用模板。目前的编译时多态性是将不同的对象放入不同的lists@DonRigatone您想要一个不同子类型的列表,还是要多个单一类型的列表?到目前为止,你已经说了这两个。你如何从语法和用法上区分智能指针和常规指针?@DonRigatone常规指针只是一个原始的C型指针-
X*
。智能指针类似于
std::shared_ptr
std::unique_ptr
boost::shared_ptr
。语义类似(使用
->
访问其内容)。