【发布时间】:2015-11-27 03:37:45
【问题描述】:
我有一个函数接受Base 类型的共享指针,然后将std::dynamic_pointer_cast 指向派生类型。但是,派生指针是 NULL,我不明白为什么。我确保在我的基类中包含一个虚拟析构函数。我不想使用静态转换,因为这不能保证我的派生成员变量和函数被保留?
代码如下:
基类:
class Base
{
public:
mType get_type()
{
return msg_type;
}
void set_type(mType type)
{
msg_type = type;
}
virtual ~cMsg() = default;
protected:
mType msg_type;
message msg;
};
派生类:
class Derived : public Base
{
public:
void set_i(int j)
{
i = j;
}
int get_i()
{
return i;
}
private:
int i;
};
执行强制转换的函数:
void callback(std::shared_ptr<Base> msg_received)
{
std::cout<< "Callback called\n";
auto real_msg = std::dynamic_pointer_cast<Derived>(msg_received);
if (real_msg != NULL)
{
std::cout << "i value is: " << real_msg->get_i() << "\n";
}
}
函数创建派生对象并调用函数:
int main()
{
Derived test_msg;
test_msg.set_i(1);
test_msg.set_type(mSystem::TEST_MSG);
std::shared_ptr<Base> msg_ptr = std::make_shared<Base>(test_msg);
callback(msg_ptr);
return 0;
}
任何帮助将不胜感激。
编辑:更正错字
【问题讨论】:
-
当然。
msg_ptr构造为Base,而不是Derived。 -
另外,您的意思是将
msg_ptr传递给callback(),请将您的示例清理为minimal, complete, and verifiable。 -
什么是“NULL 类型”?
-
NULL 类型是我的一个不好的命名习惯。我已经在问题中更改了它。
标签: c++ c++11 casting shared-ptr smart-pointers