3

编辑:将“upcast”更正为“downcast”。

当我正在使用的类来自 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 脚本的第一行更改为 read der = Derived.fromBase(baz()),则该脚本将按预期工作。

但是,我使用 reinterpret_cast 来完成这项工作的事实似乎非常错误。有没有更好的方法来降低压力,不需要使用像 reinterpret_cast 这样危险的东西?如果没有,退货政策应该fromBase()是什么?

在任何人问之前,是的,沮丧是必要的。这就是我必须使用的库的工作方式。

编辑:

我正在寻找类似 C# 代码的东西:

Base b = new Derived();
Derived d = b as Derived;
if (d != null)
    ...
4

1 回答 1

1
Base baz()
{
    return Derived();
}

从返回类型可以看出,this返回的是对象Base而不是Derived对象。所以没有什么可悲观的(而不是悲观的)。所以你首先需要解决这个问题。

更重要的是,你是对的,reinterpret_cast在这种情况下绝对是阴暗的。dynamic_cast实际上是用于向下转换的工具。

更根本的是,你应该问自己为什么你觉得需要沮丧。您的示例代码可能是合成的,不能代表您的确切问题,但为什么不应该baz返回 a Derived


这是您的代码段的等价物:

Derived d;
Base& b = d;
if(Base* p = dynamic_cast<Derived*>(&b))
    // okay; b is actually an instance of Derived
于 2012-09-01T00:26:55.637 回答