mirror of
https://github.com/RYDE-WORK/pybind11.git
synced 2026-02-03 05:53:21 +08:00
resolve issue involving inheritance + def_static + override (fixes #511)
This commit is contained in:
parent
405f6d1dfd
commit
7c2461eefd
@ -260,7 +260,7 @@ protected:
|
|||||||
chain = (detail::function_record *) rec_capsule;
|
chain = (detail::function_record *) rec_capsule;
|
||||||
/* Never append a method to an overload chain of a parent class;
|
/* Never append a method to an overload chain of a parent class;
|
||||||
instead, hide the parent's overloads in this case */
|
instead, hide the parent's overloads in this case */
|
||||||
if (chain->class_ != rec->class_)
|
if (chain->scope != rec->scope)
|
||||||
chain = nullptr;
|
chain = nullptr;
|
||||||
}
|
}
|
||||||
// Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
|
// Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
|
||||||
|
|||||||
@ -351,6 +351,26 @@ void init_issues(py::module &m) {
|
|||||||
/// Issue #484: number conversion generates unhandled exceptions
|
/// Issue #484: number conversion generates unhandled exceptions
|
||||||
m2.def("test_complex", [](float x) { py::print("{}"_s.format(x)); });
|
m2.def("test_complex", [](float x) { py::print("{}"_s.format(x)); });
|
||||||
m2.def("test_complex", [](std::complex<float> x) { py::print("({}, {})"_s.format(x.real(), x.imag())); });
|
m2.def("test_complex", [](std::complex<float> x) { py::print("({}, {})"_s.format(x.real(), x.imag())); });
|
||||||
|
|
||||||
|
/// Issue #511: problem with inheritance + overwritten def_static
|
||||||
|
struct MyBase {
|
||||||
|
static std::unique_ptr<MyBase> make() {
|
||||||
|
return std::unique_ptr<MyBase>(new MyBase());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MyDerived : MyBase {
|
||||||
|
static std::unique_ptr<MyDerived> make() {
|
||||||
|
return std::unique_ptr<MyDerived>(new MyDerived());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
py::class_<MyBase>(m2, "MyBase")
|
||||||
|
.def_static("make", &MyBase::make);
|
||||||
|
|
||||||
|
py::class_<MyDerived, MyBase>(m2, "MyDerived")
|
||||||
|
.def_static("make", &MyDerived::make)
|
||||||
|
.def_static("make2", &MyDerived::make);
|
||||||
}
|
}
|
||||||
|
|
||||||
// MSVC workaround: trying to use a lambda here crashes MSCV
|
// MSVC workaround: trying to use a lambda here crashes MSCV
|
||||||
|
|||||||
@ -237,3 +237,15 @@ def test_complex_cast(capture):
|
|||||||
1.0
|
1.0
|
||||||
(0.0, 2.0)
|
(0.0, 2.0)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def test_inheritance_override_def_static():
|
||||||
|
from pybind11_tests.issues import MyBase, MyDerived
|
||||||
|
|
||||||
|
b = MyBase.make()
|
||||||
|
d1 = MyDerived.make2()
|
||||||
|
d2 = MyDerived.make()
|
||||||
|
|
||||||
|
assert isinstance(b, MyBase)
|
||||||
|
assert isinstance(d1, MyDerived)
|
||||||
|
assert isinstance(d2, MyDerived)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user