【发布时间】:2021-06-11 16:34:54
【问题描述】:
当手动调用second() 函数时,我得到一个分段错误。我认为问题在于,在使用int (*pfunSecond)(int) = (int (*)(int)) *(((void***)pb)[0] + 1); 中的+1 向前移动地址时,程序丢失了处理first() 函数在构造D 类的内存中的位置的信息。到目前为止我还没有修复它。
#include <iostream>
class B{
public:
virtual int __cdecl first()=0;
virtual int __cdecl second(int)=0;
};
class D: public B{
public:
virtual int __cdecl first(){return 42;}
virtual int __cdecl second(int x){return first()+x;}
};
void myFunc(B* pb){
int (*pfunFirst)() = (int (*)()) *(((void***)pb)[0]);
int (*pfunSecond)(int) = (int (*)(int)) *(((void***)pb)[0] + 1);
std::cout << "Call first(): " << pfunFirst() << std::endl;
std::cout << "Call second(): " << pfunSecond(20) << std::endl;
}
int main(void){
myFunc(new D());
return 0;
}
【问题讨论】:
-
这里有一个修复 - 只需通过
pb->second()致电second。无论您在这里尝试做什么,看起来很大程度上取决于您的特定编译器的实现细节。除非你真的想深入研究(汇编代码等),否则不要这样做。 -
您通过尝试访问 v-table 导致未定义行为,这是一个实现细节,在标准 C++ 中无法访问。这个问题没有正确或安全的答案,但如果您想快速解释您观察到的行为,您应该提及您的编译器、它的版本以及您的运行方式。
标签: c++ segmentation-fault virtual-functions