2015-12-29 4 views
0

Мне нужно позвонить void foo(const base &) из libfoo.a который приходит скомпилирован с -fno-rtti. Мне нужно передать мой child класс, что требуется, чтобы присущее от base для переопределения виртуальных функций-членов, этот child класс должен существовать в условиях компиляции, где RTTI должна быть включена из-за другие требования, но если сделать что компоновщик бросает:класс ребенка с rtti из базового класса без rtti

неопределенная ссылка на `TypeInfo для base`

ли я получить доступ к` TypeInfo для base` просто inhereting из base? Есть ли способ действовать в этой ситуации? как?

+0

Возможный дубликат [класса подклассов из разделяемой библиотеки, составленной с -fno-RTTI] (http://stackoverflow.com/questions/15101859/subclassing-class-from-shared-library-compiled-with-fno -rtti) –

ответ

0

Одна возможность, если вы можете объявить объект non-rtti в качестве члена объекта rtti, - это создать третий вспомогательный класс для перевода между классами rtti и non-rtti.

class child; 

/* RttiHelper compiled WITHOUT RTTI support */ 
class RttiHelper: public base { 
public: 
    child &child_; 
    RttiHelper(const child &c): child_(c) { } 
    virtual int basefunc() override; 
    // ... 
}; 

/* child compiled WITH RTTI support */ 
class child { 
public: 
    RttiHelper base_; 
    child(): base_(*this) { } 
    virtual int basefunc() { /* ... */ } 
    void otherfunc(int x) { base_(x); } // example call of non-virtual base class method 
}; 

// implementation of RttiHelper relay functions needs to come after child class is defined 
inline int RttiHelper::basefunc() { return child_.basefunc(); } 
Смежные вопросы