在C++中,如何保存抽象类的列表?

Ome*_*bic 3 c++ oop inheritance pointers abstract

我有两个实现的类:

class DCCmd :
    public DCMessage

class DCReply :
    public DCMessage
Run Code Online (Sandbox Code Playgroud)

两者都是以两种方式发送和接收的协议消息.

现在在协议实现中我需要创建一个消息队列,但是DCMessage由于它是抽象的,它不会让我做这样的事情:

class DCMsgQueue{
private:
    vector<DCMessage> queue;
public:
    DCMsgQueue(void);
    ~DCMsgQueue(void);

    bool isEmpty();
    void add(DCMessage &msg);
    bool deleteById(unsigned short seqNum);
    bool getById(unsigned short seqNum, DCMessage &msg);
};
Run Code Online (Sandbox Code Playgroud)

问题是,正如编译器所说,"DCMessage无法实例化",因为它有一个纯抽象方法:

virtual BYTE *getParams()=0;
Run Code Online (Sandbox Code Playgroud)

删除=0和放置空的花括号来DCMessage.cpp修复问题,但这只是一个黑客.

另一种解决方案是我应该做两个DCMsgQueues:DCCmdQueueDCReplyQueue,但是这仅仅是重复的代码为一些小事.有任何想法吗?=)

Rya*_*all 14

您无法实例化该对象,因为它是抽象的,如您所说.但是,你可以拥有一个指向DCMessage类的指针向量,它只需要在将其推送到列表时添加内存地址而不是对象.

vector<DCMessage*> queue;

DCCmd* commandObject = new DCCmd(...params...);
queue.push_back(commandObject);

BYTE* params = queue[0]->getParams();
Run Code Online (Sandbox Code Playgroud)

  • 只是确保你没有存储堆栈分配对象的地址(以及在从向量中删除之前将超出范围的任何对象). (4认同)

War*_*ung 10

你想要一个DCMessage指针的向量:

vector<DCMessage*> messages;
messages.push_back(new DCCmd(blah));
Run Code Online (Sandbox Code Playgroud)

C++中的多态性只能通过指针和引用来工作,并且您不能使用引用.所以,它是指针.

  • 你在说什么和我写的不一样? (2认同)