好吧,由于某些原因,继承不是按照我认为可行的方式工作,而且让我感到非常烦恼。假设我有两个类 - 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() { }
编译器抛出一个关于“class”full :: namespace :: DerivedMessage'没有任何名为'_messageType'的字段“
我认为唯一有用的其他线程是问题是试图从孩子那里访问父亲的受保护属性 - 但我不认为这是我的情况,我试图设置DerivedMessage
' s _messageType
,我唯一需要父BaseMessage
的是声明它。
或者我是不是很糟糕?我只是想,也许我需要使用虚拟属性而不是受保护的属性?
答案 0 :(得分:7)
_messageType
作为BaseMessage
DerivedMessage
子对象的成员,需要由BaseMessage
的构造函数初始化:
class BaseMessage
{
public:
BaseMessage();
BaseMessage(const char* c) : _messageType(c) {} // <--- here
virtual ~BaseMessage();
protected:
BString<2> _messageType;
};
然后,在派生类的构造函数中,编写一个这样的转发调用:
DerivedMessage::DerivedMessage()
: BaseMessage("SS")
{ }
答案 1 :(得分:4)
成员只能由包含它的类初始化,而不能由派生类初始化。所以在基类构造函数中初始化它:
explicit BaseMessage(BString<2> type) : _messageType(type) {}
并从派生类中传递:
DerivedMessage() : BaseMessage("SS") {}