链接列表在 cpp 中包含不同的对象类
Linkedlist contain differnt classes of object in cpp
我们如何创建一个可以包含不同类对象的链表。 例如,如果一个人是基类,并且它将学生和教师作为派生类,那么我如何创建一个链表,该链表可以包含两个类的对象,如学生和老师。
LinkedList example for understanding my problem:
head->studentobject->teacherobject->studentobject->teacherobject... so on
在这里试试。std::list
是一个链表。.
#include <list>
#include <iostream>
#include <memory>
using namespace std;
class Person {
public:
virtual ~Person() = default;
virtual void talk()=0;
};
class Student : public Person {
public:
void talk() {
cout << "Teach me!n";
}
};
class Teacher : public Person {
public:
void talk() {
cout << "Listen!n";
}
};
int main() {
list<std::unique_ptr<Person>> people;
people.push_back(unique_ptr<Person>(new Student()));
people.push_back(unique_ptr<Person>(new Teacher()));
for (auto& p : people) {
p->talk();
}
return 0;
}
通常,您将创建一个基类和派生类:
#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 << "Studentn"; }
};
class Teacher : public Base {
public:
virtual void printClass() { std::cout << "Teachern"; }
};
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();
}
使用某种指针来存储引用。您可以使用原始指针,引用,智能指针,...
在这里,您可以阅读何时使用虚拟析构函数
相关文章:
- C++ 写入路径名中包含不需要的空字符的文件
- C 指针和对象作为不同类的一部分
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 为什么我的对象声明不调用默认构造函数?
- 无法打开包含文件'Graphics.hpp'没有这样的文件或目录,Visual Studio的其他包含不起作用
- 如何在 opengl 中仅旋转特定对象而不影响其他对象?
- 声明成员对象而不调用其默认构造函数
- C++ 实例化新对象时不接受继承方法默认参数值
- 在 MSVC 中,从 std::string_view 派生的对象比较不明确
- 标头包含不是 .c 程序所必需的,而是.cpp程序需要的
- 将构造对象但不是构造函数的方法
- 无法转换 .CATPart 文件.错误:输入文件路径似乎包含不支持的字符
- 声明派生类的对象而不指定它
- Qt 帧缓冲对象甚至不渲染顶点
- 模板参数类型推导在函数对象中不起作用
- AccessObjectFromPoint 返回客户端对象而不是复选框
- C++ - 在类中包含不是类对象属性的变量是否是一种不好的做法
- 将msgpack解包到任意对象,不包含msgpack_define
- 在运行时为调用函数选择对象,不包含基类和模板
- 为什么可以从QWidget创建一个对象而不将其包含在C++程序的开头