编辑:纠正“向上倾斜”是“向下倾斜”。
当我正在使用的类来自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)
...
答案 0 :(得分:1)
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