Какова настоящая цель boost :: python :: pure_virtual? - PullRequest
1 голос
/ 09 мая 2020

В документации для 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

...