提升 Python 从纯虚拟继承 Class

Boost Python Inheriting from Pure Virtual Class

在 Boost Python 模块中使用来自纯虚拟 class 的派生 class 时,我收到以下错误:

allocating an object of abstract class type

没有 Boost Python 模块,错误就不会出现。在以下示例中(接近我的用例),问题是什么?我必须让 Python 知道 BaseDerived 之间的继承关系吗?

PythonMinimal.cpp

#include <boost/python.hpp>
#include <vector>
using namespace boost::python;

//Base class - pure virtual.
template<typename T>
class Base{
public:
virtual void foo() = 0;
};

//Derived class, inherites from Base.
template<typename T>
class Derived : public Base<T>{
public:
    Derived(int a, int b){
        //Do something.
    }

    void foo(){
        //Do something else.
    }
};

//Test class, uses instances of Derived stored in STL container of Base.
template<typename T>
class TestClass{
public:
    std::vector< Base<T> > vec;

    TestClass(int a, int b){
        vec.push_back(Derived<T>(a, b));
    }

    void foo(){
        vec.at(0).foo();
    }
};

//Build python module.
BOOST_PYTHON_MODULE(cpuMLP){
    class_< TestClass<float> >("TestClass", init<int, int>())
        .def("foo", &TestClass<float>::foo);
};

CMakeLists.txt

#Set CMake Version and project name.
cmake_minimum_required(VERSION 2.8)
project(PythonMinimal)

#Attempt to find Python and Boost Python.
find_package(PythonInterp)
find_package(PythonLibs)
find_package(Boost COMPONENTS python)

#Find includes.
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})

#Add library to project.
add_library(PythonMinimal SHARED PythonMinimal.cpp)
target_link_libraries(PythonMinimal ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})

这与 python 完全无关(您没有将 BaseDerived 暴露给 python),问题出在您的 vector:

std::vector< Base<T> > vec;

Base<T> 是一个摘要 class,您持有 个值。那是行不通的。您需要通过指针存储它们:

std::vector<std::unique_ptr<Base<T>>> vec;

这样您就不会切片 Derived<T> 对象。