【发布时间】:2015-03-30 13:38:31
【问题描述】:
我觉得描述起来有点棘手。但我尽力了……
给定:
一个编(Prog_A)
一个库(Lib_A) 一个类 Class_A
还有一个带有(也)类 Class_A 的库(Lib_B)和一个成员 Class_A mClass_A
Class_A 两个类都有功能
void Class_A::DoSome(){
...
}
然后对于 Lib_A 中的 Class_A
void Class_A::DoSome(){
std::cout << "LIB_A";
}
然后对于 Lib_B 中的 Class_A
void Class_A::DoSome(){
std::cout << "LIB_B";
}
Prog_A 包括 Lib_A,Lib_A 包括 Lib_B。 Lib_A 和 Lib_B 由回调“连接”。 如果我现在在 Lib_B 中调用 mClass_A.DoSome() 那么它正在打印
LIB_A
而不是我的期望“LIB_B”。
这种行为是否正确,还是我必须担心?
【问题讨论】:
-
详细了解
virtual成员函数和vtables -
linux真的跟这个问题有关系吗?使名称不同或使用命名空间以使使用更清晰。
-
这更多地与 .ELF 可执行格式有关,而不是与 Linux 本身有关。为此,C++ 使用所谓的“弱符号”。这些可以在过程映像中出现“多次”。每个库都可以定义相同名称的符号,但第一个获胜。 PS:这不是您问题的答案。关于名称修改和符号映射到 .ELF 格式的真正答案会很长。
-
@BasileStarynkevitch 这个问题与虚拟成员函数和 vtables 无关。这是一个模棱两可的命名问题。
-
@ibre5041,上述场景中不会出现弱符号。弱符号用于内联函数和 temploid,但并非用于 C++ 中的每个符号。也许你想到的是 ELF 符号插入,它独立于弱符号。