C++:从导入的共享库中重新定义 public class 方法?
C++: redefining public class methods from imported shared library?
假设我有一个带有 class 的共享库,它定义了 public 非虚拟方法,我想导入所述共享库但重新定义其中的一些 class方法 而无需创建新的 class,在共享库内部使用这些方法时,库会调用我重新定义的方法。
从 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
这在其他 compilers/OSes/etc 中完成后是否保证有效?
不,这违反了 C++ ODR 规则,在不同的平台上以不同的方式处理。即使对于 GCC,它也是不可移植的——如果例如,插入将不起作用。代码中的符号具有受保护的可见性或库已与 -Wl,-Bsymbolic
或 -fno-semantic-interposition
.
链接
假设我有一个带有 class 的共享库,它定义了 public 非虚拟方法,我想导入所述共享库但重新定义其中的一些 class方法 而无需创建新的 class,在共享库内部使用这些方法时,库会调用我重新定义的方法。
从 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
这在其他 compilers/OSes/etc 中完成后是否保证有效?
不,这违反了 C++ ODR 规则,在不同的平台上以不同的方式处理。即使对于 GCC,它也是不可移植的——如果例如,插入将不起作用。代码中的符号具有受保护的可见性或库已与 -Wl,-Bsymbolic
或 -fno-semantic-interposition
.