首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ downcast (使用dynamic_cast )返回NULL?

C++ downcast (使用dynamic_cast )返回NULL?
EN

Stack Overflow用户
提问于 2010-08-25 22:19:51
回答 3查看 6.7K关注 0票数 1

环境: Linux C++ / Qt 4x

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

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

-Ed

代码语言:javascript
复制
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;
};

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

-Ed

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-25 22:26:54

您通过值传递一个fes::EventArgs对象,这意味着它是一个fes::EventArgs对象。如果您想保留多态对象的原始类型,请传递一个指针或(最好是)对它们的引用:

代码语言:javascript
复制
void MainWindow::onRtledaEventHandler(fes::EventArgs& eventArgs) {
   fes::AtsCommandEventArgs& atsCommandEventArgs = dynamic_cast< fes::AtsCommandEventArgs&>(eventArgs);
}

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

票数 12
EN

Stack Overflow用户

发布于 2010-08-25 22:23:08

如果要强制转换的类型之间是无关的,或者如果您提供了空指针进行强制转换,则dynamic_cast<>将返回NULL。检查是在运行时对RTTI提供的类型信息执行的,您可以信任它。

所以只有这两种可能性。

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

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

票数 0
EN

Stack Overflow用户

发布于 2010-08-25 22:24:37

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

第二种可能性是,这种情况下,您认为您正在执行向上转换,而实际上它不是向上转换。您还没有展示使用强制转换调用函数的任何代码,所以无法说出发生了什么。

看看你的代码:你的代码中没有向上转换。你正在尝试做的是一种向下转换。传递给函数的参数是通过值传递的,这意味着它在过程中被分片了。难怪向下转换失败了。它应该会失败。必须通过指针或引用传递才能使用dynamic_cast

附言:不要使用HTML标签来格式化代码。使用“代码”按钮。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3566799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档