从共享对象中的类继承

Inheriting from Classes in Shared Object

本文关键字:继承 共享 对象      更新时间:2023-10-16

我想通过继承来扩展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; }
    };
} 
平台:GCC 4.5 on RHEL 5

(class)全局静态变量在不同翻译单元中的初始化顺序未定义。但是,如果将类静态变量Pi包装到成员函数中,则将其替换为局部静态对象。有效的c++条款4:"通过用局部静态对象替换非局部静态对象来避免跨翻译单元的初始化顺序问题。"如果对象保持全局静态,在其他代码使用它之前,它可能保持未初始化。

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