具有rtti的子类,来自基类,没有rtti

时间:2015-12-29 04:40:01

标签: c++ linker clang rtti clang++

我需要从使用void foo(const base &)编译的libfoo.a致电-fno-rtti。我需要传递child所需的base类来覆盖虚拟成员函数,这个child类必须存在于编译设置中,因为其他要求必须启用RTTI,但是如果链接器抛出那个:

  

未定义引用`typeinfo for base`

我是否仅仅通过base来访问`typeinfo for base`?有没有办法在这种情况下进行?如何?

1 个答案:

答案 0 :(得分:0)

如果您可以将非rtti对象声明为rtti对象的成员,则有一种可能性是创建第3个辅助类以在rtti和非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(); }