c++ - 从共享对象中的类继承

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

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

// 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。

最佳答案

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

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

关于c++ - 从共享对象中的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16423731/

相关文章:

c++ - 编译器可以告诉我它选择了哪个重载函数或模板函数吗?

c++ - Constexpr 类 : Inheritance?

c++ - 在库中使用模板

c++ - 由于日志的程序 block

c++ - 检查另一个进程中的线程是否正在休眠

javascript - JavaScript 中的继承导致 Uncaught TypeError

c++ - 使用继承类型调用基类函数

c++ - GNU ld 找不到存在的库

rmpi 无法以非 root 用户身份加载共享库

c++ - 为什么编译器可以找到这些运算符重载之一而不是另一个?