Usually you would create a base class and derived classes:
#include <iostream>
#include <list>
#include <memory>
class Base {
public:
virtual ~Base() = default;
virtual void printClass() = 0;
};
class Student : public Base {
public:
virtual void printClass() { std::cout << "Student\n"; }
};
class Teacher : public Base {
public:
virtual void printClass() { std::cout << "Teacher\n"; }
};
class Node {
public:
void setTeacher() {
data = std::make_unique<Teacher>();
}
void setStudent() {
data = std::make_unique<Student>();
}
void printClass() { data->printClass(); }
private:
std::unique_ptr<Base> data;
};
int main() {
std::list<Node> l;
l.push_back({});
l.front().setTeacher();
l.front().printClass();
}
Use some kind of pointer to store the references. You can use raw pointers, references, smart pointers, ...
Here you can read when to use virtual destructors