РЕДАКТИРОВАТЬ: исправлено «upcast» на «downcast».
Я пытаюсь найти лучший способ сделать понижающее приведение в 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()
?
Прежде чем кто-либо спросит, да, опустошенный необходим. Вот как работает библиотека, которую я должен использовать.
РЕДАКТИРОВАТЬ:
Я ищу что-то, что работает как этот код С#:
Base b = new Derived();
Derived d = b as Derived;
if (d != null)
...