Hi, I've found a bug where Boost.Python calls the wrong function overload. Here is a small unit test: ===== The C++ module "_test.cpp": ===== #include <boost/python.hpp> #include <string> class Base { }; class Derived : public Base { }; std::string f(Base& b) { return "Base"; } std::string f(Derived& d) { return "Derived"; } BOOST_PYTHON_MODULE( _test ) { using namespace boost::python; class_<Base>("Base"); class_<Derived, bases<Base> >("Derived"); def("f", static_cast<std::string (*)(Derived&)>(&f)); def("f", static_cast<std::string (*)(Base&)>(&f)); } ===== The small test in python: =====
from _test import * f(Base()) 'Base' f(Derived()) 'Base'
===== Interestingly enough, if the function overloads are exported in the inverse order, it actually works, i.e., if using this code: ===== BOOST_PYTHON_MODULE( _test ) { using namespace boost::python; class_<Base>("Base"); class_<Derived, bases<Base> >("Derived"); def("f", static_cast<std::string (*)(Base&)>(&f)); def("f", static_cast<std::string (*)(Derived&)>(&f)); } ===== I do not know very well how does the boost.python registry works, but it seems that it is selecting the first match instead of testing all matches and selecting the "best one".