C++:从导入的共享库中重新定义 public class 方法?

C++: redefining public class methods from imported shared library?

假设我有一个带有 class 的共享库,它定义了 public 非虚拟方法,我想导入所述共享库但重新定义其中的一些 class方法 而无需创建新的 class,在共享库内部使用这些方法时,库会调用我重新定义的方法。

从 linux 中使用 GCC 的一些实验来看,一切似乎都按预期工作,但我想知道我是否只是走运,或者我正在做的事情是否能保证在其他环境中正常工作。

示例:

class Myclass {
public:
    int val;
    void set_myval(); //I want to override this
    void set_myval_v2();
    void print_myval();
};
#include <iostream>
#include "shared.h"

void Myclass::set_myval() {
    this->val = 100;
}
void Myclass::set_myval_v2() {
    this->set_myval();
}
void Myclass::print_myval() {
    std::cout << "val:" << this->val << std::endl;
}
#include "shared.h"

void Myclass::set_myval() {
    this->val = 200;
}

int main()
{
    Myclass obj;
    obj.set_myval();
    obj.print_myval();

    obj.set_myval_v2();
    obj.print_myval();
    return 0;
}

然后我编译它 运行 如下:

g++ -c -fPIC shared.cpp -o shared.o
gcc shared.o -shared -o libshared.so
g++ app.cpp -L<path> -l:libshared.so -Wl,-rpath=<path>
./a.out
val:200
val:200

这在其他 compilers/OSes/etc 中完成后是否保证有效?

不,这违反了 C++ ODR 规则,在不同的平台上以不同的方式处理。即使对于 GCC,它也是不可移植的——如果例如,插入将不起作用。代码中的符号具有受保护的可见性或库已与 -Wl,-Bsymbolic-fno-semantic-interposition.

链接