UML Class 图:如何使用其基 class 正确表示派生 classes 的向量?

UML Class Diagram: How do I correctly represent a vector of derived classes using their base class?

我有一个由服务器组成的应用程序,该服务器可以有两种类型的多个客户端,用户客户端设备客户端。为此,我有一个客户端基础矢量 class,我将在新客户端连接到服务器时将其添加到其中。这是我所拥有的简化版本:

class Client
{
protected:
    int m_port;
    Client(int port): m_port{port}{}
public:
    virtual ~Client(){}
}

class User: public Client
{
public:
    User(int port): Client{port}{}
    virtual ~User(){}
}

class Device: public Client
{
public:
    User(int port): Client{port}{}
    virtual ~Device(){}
}

class Server
{
public:
    Server(int port): m_port{port}{}

    ~Server()
    {
       for (std::vector<Client*>::iterator it = m_clients.begin();
            it != m_clients.end();
            it++){
           free(m_clients.pop_back());
           }
    }

    void run()
    {
        if(m_port == 1){
            m_clients.pushback(new User(port));
        }else{
            m_clients.pushback(new Device(port));
        }
    }
private:
    int m_port;
    std::vector<Client*> m_clients;
}

我有以下 UML 表示:

我怀疑这张图是否代表了正确的意图。也许我对 UML 没有那么多经验,这就足够了,但我认为这张图没有清楚地描述服务器中的向量将包含 User(s) 和 Device(s) 而不是 Client(s)。我不知道我是否需要放置一个额外的刻板印象标签,一个额外的注释,或者一个额外的 link 或者像这样的关联:

那么,如何在 UML 中正确表示此 c++ class 关系?

I think this diagram doesn't clearly depict the fact that the vector in the server will contain User(s) and Device(s) and not Client(s). I don't know if I need to put an extra stereotype label, an extra note, or an extra link or association

你只需要在你的第一个图中说 class Clientabstract ,你可以证明写它图中斜体字的名字。不要像在第二张图中那样添加关联。

警告 m_clientServer 中是私有的,但您使用了 + 而不是 -

你使用了ServerClient之间的组合,你确定是这样然后当服务器消失时客户端消失? C++ 代码中没有这样做。(参见 OP 备注)

已将 m_client 绘制为关联,因此没有必要将其也显示为属性。

客户端不知道服务器,这更容易绘制非双向关联(即Server -------> Client)。

C++ 定义使用 vector 对元素进行排序,您可以指示 属性 使用 {ordered}

进行排序

由于 运行 的 C++ 定义 if(m_port == 1) 服务器有客户端或独占设备,您可以指出通过约束

<<ctor><<vector>> 未在标准中定义,但我不反对使用它们。