【发布时间】:2019-04-30 05:44:11
【问题描述】:
我正在使用提供消息的PolyM message queue
class Msg
以及带有模板有效负载的消息
template<typename PayloadType> class DataMsg: public Msg
这一直有效,直到我将 DataMsg 模板嵌套在另一个 DataMsg 中,就像这样...
DataMsg<DataMsg<int>>
并尝试提取嵌套的 DataMsg 以将其传递给进一步处理。为此,我像这样转换为 Msg 基类型:
function(Msg &base) {
auto &msg = dynamic_cast<DataMsg<Msg>&>(base).getPayload();
}
此转换失败并出现错误的转换异常。改用 static_cast 似乎没有任何副作用。
从多态的角度来看,我看不出我的方法有什么问题。由于动态转换适用于非嵌套类型,它也应该适用于嵌套类型?
我在 PolyM GitHub issues page 上问过这个问题,但是没有得到正确的解释为什么演员表失败。
这是一个显示问题的简约示例:
#include <memory>
#include <iostream>
using namespace std;
class Msg {
public:
virtual ~Msg() {}
};
template<typename PayloadType>
class DataMsg: public Msg {
public:
virtual ~DataMsg() {}
PayloadType& getPayload() const
{
return *pl_;
}
private:
PayloadType* pl_;
};
static void getInnerMsg(Msg &msgMsg) {
try {
auto &msg = dynamic_cast<DataMsg<Msg>&>(msgMsg).getPayload();
std::cout << "cast OK" << endl;
} catch ( std::bad_cast& bc ) {
std::cerr << "bad_cast caught: " << bc.what() << endl;
}
}
还有我的测试用例:
int main(int argc, char *argv[])
{
Msg msg1;
DataMsg<int> msg2;
DataMsg<Msg> msg3;
DataMsg<DataMsg<int>> msg4;
cout << "expect bad cast (no nested message)" << endl;
getInnerMsg(msg1);
cout << "-------------" << endl;
cout << "expect bad cast (no nested message)" << endl;
getInnerMsg(msg2);
cout << "-------------" << endl;
cout << "expect successful cast (nested message base type)" << endl;
getInnerMsg(msg3);
cout << "-------------" << endl;
cout << "expect successful cast (nested message child type)" << endl;
getInnerMsg(msg4);
return 0;
}
使用“g++ test.cpp -o test.x && ./test.x”运行。 GitHub issue 包含更完整的使用示例。
【问题讨论】:
-
您为什么希望在案例 4 中成功转换?
DataMsg<DataMsg<int>>没有任何DataMsg<Msg>类型的主题。
标签: c++ polymorphism message-queue dynamic-cast