C++队列存储多种类型对象

标签 c++ oop generics inheritance queue

到目前为止,我最好的想法是使用一个基类并将其子类化为不同类型的对象。在这种情况下,有两个具有相似方法的子类,因此这似乎是合乎逻辑的。我通过向上转换到基类来存储对象,但是在使用其子类方法访问对象时遇到了问题。这是我的头文件和主要方法:

#include <iostream>
#include <queue>
#include <stdlib.h>
#include <string>
#include <sstream>

#define STATIC 0
#define DYNAMIC 1

// Base class Msg
class Msg {
  public:
    void set_type(int);
    int get_type();
    virtual std::string repr();
    virtual int* get_data();
  protected:
    int type;
};

// Derived class StaticMsg
class StaticMsg: public Msg {
  public:
    void set_data();
    std::string repr() override;
    int* get_data() override;
  protected:
    int data[10];
};

class DynamicMsg: public Msg {
  public:
    DynamicMsg();
    void set_data(int sz);
    std::string repr() override;
    int* get_data() override;
  protected:
    int len, *data;
};

int main(void) {
  StaticMsg smsg,new_smsg;
  DynamicMsg dmsg,new_dmsg;

  smsg.set_type(STATIC);
  smsg.set_data();
  dmsg.set_type(DYNAMIC);
  dmsg.set_data(21);

  queue <Msg> q;

  q.push(smsg);
  q.push(dmsg);

  cout <<q.front().get_type() << endl;
  // FIXME call to repr() is causing segmentation fault
  cout <<q.front().repr()<<endl;
  cout << "here!"<<endl;
}

如何将两个不同的类存储在单个数据结构中并在检索它们时访问它们的原始方法?

或者有其他选择

最佳答案

对象切片将在这里发生。您的 child 类对象将被切片为 base 类类型,因为您在调用 push_back 时按值传递。您需要使用基类的指针或智能指针的队列

关于C++队列存储多种类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36169703/

相关文章:

c++ - WinDbg 是如何认识源码的?

c++ - 使用模板制作类型安全的 C++ "component manager"

c++ - 全局变量和链接器错误

java - 如何正确拆分类(OOP)?

c# - 在 Java 中创建 T 的新实例

c++ - Cocos2D-X - 初始化 CCTMXTiledMap 时出现 EXC_BAD_ACCESS(代码=2,地址=0x0)

javascript OOP 不工作 : Uncaught TypeError: object is not a function

java - 模型对象应该有接口(interface)吗?

generics - 在运行时使用 Guice 通过 Types 和 TypeLiterals 重构泛型类型

java - 有没有办法在父类(super class)中定义泛型方法来引用继承类的类型?