C++类成员隐藏规则:设计问题



我有一个基类,Message,它决定了策略。我也有该类的派生,用于特定的消息实例。

请考虑以下简化示例:

template< ::size_t MessageSize >
struct Message {
    enum { size = MessageSize };
    Bits< ChunkSize > bits_[size / ChunkSize];
    // Defines behavior for the Message types
};
template< ::size_t MessageSize >
struct SmallMessage : public Message< MessageSize > {
    Bits< MessageSize > bits_;
};
// other derivations of Message...
template< class MessageType, ::size_t MessageSize >
struct MakeMessage {
    typedef typename IfElseType<
            MessageSize < ChunkSize,
            SmallMessage< MessageSize >,
            Message< MessageSize >
        >::type type;
};

如果ChunkSize是 32,我生成以下内容:

MakeMessage< FooMessage, 16 >

Message< 16 >将导致一个Bits< 32 > bits_[0];SmallMessage< 16 >将包含Bits< 16 > bits_据我了解,这些将掩盖原始的零大小成员。

我知道有几种方法可以解决这个问题:

  1. 声明 bits_ 以外的名称,并提供覆盖的接口
  2. 修改SmallMessage以隐藏处理bits_本地实现的所有Message方法
  3. 使Message中的方法虚拟

我的问题是这两种方法是否有好处,或者是否有更好的方法来为各种大小的内存容器提供接口,如上所述。

最终,我想有一些类似的东西:

typedef MakeMessage< FooMessage, 16 >::type message_type;
// ...
message_type message;
message.doSomethingToBits ();

无论实际使用什么容器,工作方式都相同。

好吧,尽我所能通过大量的templatetypename,你试图使用继承来作曲,这被认为是错误的方式。 SmallMessage这里是一种Message,因为正如你所注意到的,它不支持以相同的方式处理bits_数组。

我认为正确的方法是将Message作为抽象基类(重要:没有任何类型的bits_,可能有很多纯虚函数),然后SmallMessageBigMessage作为实现。此外,由于您无论如何都使用模板来处理所有内容,因此类型是在编译时制定的,实际上可能根本没有理由使用Message。只要SmallMessageBigMessage具有相同的签名,即使它们没有公共基类,也可以按照您的描述使用message_type。您需要基类Message的唯一原因是,如果要使用后期绑定更普遍地讨论消息。尽管拥有基类也会静态地强制签名在声明中匹配,而不是给出奇怪的错误......有时。。。在代码的遥远部分,因为您在其中一个类(而不是另一个类)中错误地声明了方法。

可以

肯定的是,您还希望BigMessage::bits_ [(size-1) / ChunkSize + 1],这只是天花板而不是地板。这样,您实际上有足够的Bits来容纳您的所有位。

最新更新