В документации для boost::python::pure_virtual
просто сказано:
pure_virtual
означает Boost. Python, что функция f является чистой виртуальной функцией.
Но У меня нет проблем со следующим кодом с или без pure_virtual
:
#include <string>
#include <iostream>
#include <boost/python.hpp>
namespace bpy = boost::python;
struct A {
virtual std::string f() const = 0;
virtual ~A() { }
};
struct B: A {
B() = default;
std::string f() const override { return "B()"; }
};
struct A_Wrapper: A, bpy::wrapper<A> {
std::string f() const override { return get_override("f")(); }
};
BOOST_PYTHON_MODULE(example)
{
bpy::class_<A_Wrapper, boost::noncopyable>("A")
.def("f", bpy::pure_virtual(&A::f)) // <-- Removing pure_virtual here changes nothing.
.def("b", +[]() -> A* { return new B; }, bpy::return_value_policy<bpy::manage_new_object>()).staticmethod("b")
.def("display", +[](A *a) {
std::cout << a->f() << '\n';
}).staticmethod("display")
;
}
И в python:
from example import A
b = A.b()
print(b.f())
A.display(b)
class A2(A):
def f(self): return "A2()"
a2 = A2()
print(a2.f())
A.display(a2)
Выходы:
B()
B()
A2()
A2()
... как и ожидалось, с bpy::pure_virtual
или без
Итак, когда мне следует использовать pure_virtual
? Что он на самом деле делает?
Полный рабочий пример на Coliru: http://coliru.stacked-crooked.com/a/33840d56f0fad9ea