1

环境:Linux C++ / Qt 4x

我不明白为什么下面的downcast返回NULL?我在下面粘贴了基类和派生类。

提前感谢任何提示或建议。

-埃德

void MainWindow::onRtledaEventHandler(fes::EventArgs eventArgs)
{
   // This cast returns a NULL ?
   fes::AtsCommandEventArgs* atsCommandEventArgs = dynamic_cast<fes::AtsCommandEventArgs*>(&eventArgs);
}


/// The base class for containing event arguments sent to clients using boost::signals2
class EventArgs
{
public:

   EventArgs() {}
   EventArgs(RtledaEventType eventType) :
         m_eventType(eventType) {}
   EventArgs(const EventArgs& eventArgs) :
         m_eventType(eventArgs.m_eventType) {}
   virtual ~EventArgs() {}

   /// The type of event this is
   RtledaEventType eventType() const { return m_eventType; }

protected:
   RtledaEventType m_eventType;
};

// Derived class I am trying to upcast to
class AtsCommandEventArgs : public EventArgs
{
public:
   /// \param [in] lraddsPacketError LRADDS oacket error structure
   /// \sa fes::StructPacketStats_t packetStats
   AtsCommandEventArgs(fes::AtsCommand atsCommand, std::string messageBuffer, std::string details) :
         EventArgs(RtledaEventTypeAtsCommand),
         m_atsCommand(atsCommand),
         m_messageBuffer(messageBuffer),
         m_details(details) {}

   AtsCommandEventArgs(const AtsCommandEventArgs& AtsCommandEventArgs) :
         EventArgs(AtsCommandEventArgs),
         m_atsCommand(AtsCommandEventArgs.m_atsCommand),
         m_messageBuffer(AtsCommandEventArgs.m_messageBuffer),
         m_details(AtsCommandEventArgs.m_details) {}

   AtsCommandEventArgs() {}
   ~AtsCommandEventArgs() {}

   fes::AtsCommand atsCommand() const { return m_atsCommand; }
   std::string messageBuffer() const { return m_messageBuffer; }
   std::string details() const { return m_details; }

private:
   fes::AtsCommand m_atsCommand;
   std::string m_messageBuffer;
   std::string m_details;
};

提前感谢您的任何提示或建议,

-埃德

4

3 回答 3

12

您正在按值传递fes::EventArgs对象,这意味着它一个fes::EventArgs对象。如果要保留多态对象的原始类型,请传递指针或(更好)对它们的引用:

void MainWindow::onRtledaEventHandler(fes::EventArgs& eventArgs) {
   fes::AtsCommandEventArgs& atsCommandEventArgs = dynamic_cast< fes::AtsCommandEventArgs&>(eventArgs);
}

请注意,如果应用于引用,则会在失败的情况下dynamic_cast抛出。std::bad_cast

于 2010-08-25T14:26:54.180 回答
0

dynamic_cast<>NULL如果您要转换的类型不相关,或者您已为其提供了一个 NULL 指针以进行转换,则返回。检查是在运行时根据 RTTI 提供的类型信息执行的,您可以信任它。

所以只有这两种可能。

eventArgs 不是 AtsCommandEventArgs 或 eventArgs 将 a 引用为 NULL。

像其他人注意到的那样,您通过值传递 eventArgs,因此对象的 AtsCommandEventArgs 部分不会被复制到。正如其他人告诉您的那样,通过指针或引用传递 AtsCommandEventArgs。

于 2010-08-25T14:23:07.850 回答
0

向上转换返回空指针的唯一方法是当您将空指针作为转换的参数传递时。

第二种可能性是这种情况是您认为您正在执行upcast,而实际上它不是 upcast 。您没有显示任何使用强制转换调用该函数的代码,因此无法说明那里发生了什么。

查看您的代码:您的代码中没有向上转换。你想做的是沮丧。并且您传递给函数的参数是通过value传递的,这意味着它在过程中被切片。难怪垂头丧气会失败。它应该失败。您必须通过指针或引用传递 use dynamic_cast

PS 不要使用 HTML 标签来格式化 SO 上的代码。使用“代码”按钮。

于 2010-08-25T14:24:37.047 回答