0

Есть класс с виртуальными функциями, например, Parent вида:

файл Parent.h:

class Parent
{
public:
  Parent() {}
  virtual ~Parent();
};

файл Parent.cpp:

#include "Parent.h"
Parent::~Parent()
{
}

из них строится динамическая библиотека libParent.so

могу ли я в другом своём проекте как-то создать и использовать наследника, например, класс Child вида:

файл Child.h:

#include "Parent.h"
class Child : public Parent
{
public:
  Child() {}
  virtual ~Child();
};

файл Child.cpp:

#include "Child.h"
Child::~Child()
{
}
Child tmp;

и собирается проект Child с помощью CMake, фрагмент CMakeLists.txt:

add_library( # Sets the name of the library.
        parent
        # Sets the library as a shared library.
        SHARED
        # Provides a relative path to your source file(s).
        IMPORTED)
set_target_properties(parent PROPERTIES IMPORTED_LOCATION
        $ENV{PARENT_PATH}/libParent.so)

add_library( # Sets the name of the library. child # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). $ENV{CHILD_PATH}/Child.cpp)

target_link_libraries( # Specifies the target library. child parent)

В результате при построении я получаю ошибку вида:

Child.cpp.o:Child.cpp:typeinfo for Child: error: undefined reference to 'typeinfo for Parent'

Как я понимаю, это происходит потому, что виртуальные функции класса Parent определены в файле Parent.cpp и соответственно находятся только внутри библиотеки libParent.so, а в Parent.h есть только их объявление и в результате при построении проекта Child компилятор не находит необходимые ему определения виртуальных функций родительского класса и выдаёт ошибку.

Если я перенесу определение виртуальных функций из Parent.cpp в Parent.h, то ошибка исчезает. Как я понимаю, поскольку теперь в Parent.h содержится полная информация о классе Parent и этого достаточно для построения дочернего класса Child.

Но что мне можно сделать, если я не хочу менять эту стороннюю библиотеку libParent.so и переносить определения виртуальных функций из cpp в h, а просто хочу воспользоваться её классом Parent с виртуальными функциями в качестве предка для моего класса Child? Возможно ли это в принципе? Может мне нужно каким-то особым образом подключить к проекту Child библиотеку libParent.so, чтобы при построении проекта Child компилятор мог увидеть/использовать определения виртуальных функций внутри библиотеки libParent.so?

Elija
  • 93

0 Answers0