环境: Linux C++ / Qt 4x
我不明白为什么下面的向下转换返回NULL?我在下面粘贴了基类和派生类。
提前感谢您的任何提示或建议。
-Ed
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
发布于 2010-08-25 22:26:54
您通过值传递一个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-25 22:23:08
如果要强制转换的类型之间是无关的,或者如果您提供了空指针进行强制转换,则dynamic_cast<>将返回NULL。检查是在运行时对RTTI提供的类型信息执行的,您可以信任它。
所以只有这两种可能性。
eventArgs不是AtsCommandEventArgs,或者eventArgs将a引用为NULL。
正如其他人已经注意到的那样,您通过值传递eventArgs,因此对象的AtsCommandEventArgs部分不会被复制到。正如其他人告诉您的那样,通过指针或引用传递AtsCommandEventArgs。
发布于 2010-08-25 22:24:37
向上转换返回空指针的唯一方法是将空指针作为转换的参数进行传递。
第二种可能性是,这种情况下,您认为您正在执行向上转换,而实际上它不是向上转换。您还没有展示使用强制转换调用函数的任何代码,所以无法说出发生了什么。
看看你的代码:你的代码中没有向上转换。你正在尝试做的是一种向下转换。传递给函数的参数是通过值传递的,这意味着它在过程中被分片了。难怪向下转换失败了。它应该会失败。必须通过指针或引用传递才能使用dynamic_cast。
附言:不要使用HTML标签来格式化代码。使用“代码”按钮。
https://stackoverflow.com/questions/3566799
复制相似问题