【问题标题】:C++ Inheriting Protected MembersC++ 继承受保护的成员
【发布时间】:2014-06-09 23:25:30
【问题描述】:

好吧,由于某种原因,继承并没有像我想象的那样工作,这让我非常烦恼。假设我有两个课程 - BaseMessage 和 DerivedMessage。相同的命名空间。我在messages.hpp 中这样定义它们:

class BaseMessage
{
public:
    BaseMessage();
    virtual ~BaseMessage();

protected:
    BString<2> _messageType;
};

class DerivedMessage : public BaseMessage
{
public:
    DerivedMessage();
    virtual ~DerivedMessage();

protected:
    BString<2> _informationType;
};

我的想法是,我有多个派生消息,所有消息都具有唯一字段(我没有在这里包含),但它们都有消息类型。所以我想我会将 messageType 粘贴到父类中,并让它的所有子类都继承它。除非我显然做错了,因为如果我们查看messages.cpp:

BaseMessage::BaseMessage() { }

BaseMessage::~BaseMessage() { }

/* #TODO: Implement helper functions */

/* *** *** *** *** *** *** *** *** *** *** *** ***  */

DerivedMessage::DerivedMessage()
: _messageType("SS")
{

}

DerivedMessage::~DerivedMessage() { }

编译器抛出一个关于“类‘full::namespace::DerivedMessage’没有任何名为‘_messageType’的字段”的错误

我发现唯一有用的另一个线程是一个问题是试图从孩子访问父母的受保护属性 - 但我不认为这是我的情况,我正在尝试设置 DerivedMessage 的 @ 987654328@,我唯一需要父BaseMessage声明它。

还是我做得不好?我只是想,也许我需要使用虚拟属性而不是受保护的属性?

【问题讨论】:

  • 我可能是错的,因为我不知道您打算如何处理您的消息,但您可能希望避免使用消息类型并让消息通过虚函数发送,因此接收者的消息只需要调用该函数而不是检查类型。

标签: c++ inheritance


【解决方案1】:

成员只能由包含它的类初始化,而不能由派生类初始化。所以在基类构造函数中初始化它:

explicit BaseMessage(BString<2> type) : _messageType(type) {}

并从派生类传递:

DerivedMessage() : BaseMessage("SS") {}

【讨论】:

    【解决方案2】:

    _messageType,作为DerivedMessage的子对象BaseMessage的成员,需要由BaseMessage的构造函数初始化:

    class BaseMessage
    {
    public:
        BaseMessage();
        BaseMessage(const char* c) : _messageType(c) {}   // <--- here
        virtual ~BaseMessage();
    
    protected:
        BString<2> _messageType;
    };
    

    然后,在派生类的构造函数中,编写如下转发调用:

    DerivedMessage::DerivedMessage()
    : BaseMessage("SS")
    {  }
    

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 2023-03-03
      • 2016-09-24
      • 2018-12-27
      • 2012-10-03
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多