继承自共享对象中的类

时间:2013-05-07 16:09:45

标签: c++ inheritance shared-libraries elf static-members

我想通过继承扩展Linux共享对象中的类的C ++ namespace。可能出现的问题是什么,特别是涉及静态对象和成员数据?

// as a crude example (note: untested code)
// compiled into libBase.so
namespace foo
{
    class Cfoo
    {
    protected:
        static double Pi; // defined outside header
    public:
        Cfoo () {}
        double fooPi () { Pi *= Pi; return Pi; }
    };
}

// compiled into libDerived.so
namespace foo
{
    class Cbar : public Cfoo
    {
        double barPi () { Pi = sqrt(Pi); return Pi; }
    };
} 

平台:RHEL 5上的GCC 4.5。

1 个答案:

答案 0 :(得分:2)

不同翻译单元中(类)全局静态变量的初始化顺序为undefined。但是,如果将类静态变量Pi包装到成员函数中,则将其替换为本地静态对象。有效的C ++第4项:“通过用本地静态对象替换非本地静态对象,避免跨翻译单元的初始化顺序问题。”如果对象保持全局静态,则可能会在其他代码使用它之前保持未初始化状态。

protected:
     static double PI()
     {
         static double PI = 3.141;
         return PI; 
     }