c++:从导入的共享库重新定义公共类方法?



假设我有一个共享库,其中有一个定义了公共非虚方法的类,我想要导入该共享库,但要重新定义其中一些类方法,而不创建新类当我重新定义的方法在共享库内部使用时,库将调用这些方法。

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

的例子:

  • shared.h:
class Myclass {
public:
int val;
void set_myval(); //I want to override this
void set_myval_v2();
void print_myval();
};
  • shared.cpp:
#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;
}
  • app.cpp:
#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

在其他编译器/操作系统/等中完成时保证工作吗?

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

相关内容

  • 没有找到相关文章

最新更新