【问题标题】:Downcast in Boost.PythonBoost.Python 中的向下转型
【发布时间】:2012-08-31 21:42:59
【问题描述】:

编辑:将“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 脚本的第一行更改为 der = Derived.fromBase(baz()),则该脚本将按预期工作。

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

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

编辑:

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

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

【问题讨论】:

  • dynamic_cast 而不是 reinterpret_cast?

标签: c++ python boost boost-python


【解决方案1】:
Base baz()
{
    return Derived();
}

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

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

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


这里相当于你的 sn-p:

Derived d;
Base& b = d;
if(Base* p = dynamic_cast<Derived*>(&b))
    // okay; b is actually an instance of Derived

【讨论】:

  • 不,我说的是正确的。我的例子不能完全代表这种情况,但这不重要。实际上 Base 是一个接口类(它只有虚函数),这就是 baz() 返回的内容。我有一种感觉,我必须使用的这些类最初是用 C# 编写的,因为在那里向上转换比用 C++ 安全得多。
  • @Mr.Ambiguous 你怎么看this
  • 我不在乎 typeid 函数认为类型是什么。我知道指向的内存包含派生的,即使 typeid 将其视为基础。 reinterpret_cast 有效的事实证明确实如此。我只是想知道是否有更安全的方法。
  • @Mr.Ambiguous typeid 不是函数,它反映了多态类型对象的实际动态类型。如果您的代码实际上涉及 Derived 对象,那么您的帖子应该反映这一点。事实上,baz() 不是 Derived 对象。不需要“证明”,这是语言的规则。
  • 我很抱歉。你对我试图沮丧的事实是正确的。我假设基础将位于层次结构的底部,而不是(不合逻辑地)位于顶部。我认为我对 C++ 工作原理的理解完全不正确,因为当我向Base 添加一个虚函数以使其与dynamic_cast 一起编译时,演员表给了我null。我在离开虚拟功能时将其改回reinterpret_cast,这导致对bar()的调用停止工作。
猜你喜欢
  • 2023-03-16
  • 2016-05-08
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多