[英]Downcast in Boost.Python
编辑:纠正“upcast”为“低调”。
当我正在使用的类来自C ++时,我正试图找出在Python中进行向下转换的最佳方法。 如果我在C ++中定义了两个类:
struct Base
{
int foo()
{
return 7;
}
};
struct Derived : Base
{
int bar()
{
return 42;
}
};
另一个功能
Base baz()
{
return Derived();
}
如果我尝试使用Python
der = baz()
print der.foo()
print der.bar()
对bar()的调用失败,因为Python只知道Base中的函数。
我的解决方案是为Derived添加另一个函数:
Derived * fromBase(Base * b)
{
return reinterpret_cast<Derived *>(b);
}
如果我然后将Python脚本的第一行更改为读取der = Derived.fromBase(baz())
,则脚本将按预期工作。
但是,我使用reinterpret_cast来完成这项工作似乎非常错误。 有没有更好的方法来进行向下转换,不需要使用像reinterpret_cast这样危险的东西? 如果没有, fromBase()
的退货政策应该是什么?
在有人要求之前,是的,这种沮丧是必要的。 这就是我必须使用的库。
编辑:
我正在寻找像这个C#代码一样的东西:
Base b = new Derived();
Derived d = b as Derived;
if (d != null)
...
Base baz()
{
return Derived();
}
从返回类型可以看出,这返回一个Base
对象, 而不是 Derived
对象。 所以没有什么可以向下倾斜(而不是向上)。 所以你首先要解决这个问题。
更重要的是,你是对的,在这种背景下, reinterpret_cast
肯定是阴暗的。 dynamic_cast
实际上是用于向下转换的工具。
更重要的是,你应该问问自己为什么你觉得需要垂头丧气。 这可能是你的示例代码是你确切的问题的合成,而不是代表的情况下,但为什么不应该baz
返回Derived
?
以下是您的代码段的等效内容:
Derived d;
Base& b = d;
if(Base* p = dynamic_cast<Derived*>(&b))
// okay; b is actually an instance of Derived
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.