抽象类的Do变量包含跳转指针
Does variable of Abstract Class contains jump pointer
例如:
class A
{
virtual int foo()=0;
virtual int foo1() = 0;
virtual int foo2() = 0;
};
我知道抽象类有vtable,但vtable包含任何信息(跳转到函数的指针)。我认为它一定是无效的,否则就什么都没有了。
因为我不能单独实例化,所以我不能从内存中进行检查。
class A
{
public:
virtual void foo()=0;
virtual void foo1() = 0;
virtual void foo2() = 0;
};
class B : public A
{
public:
virtual void foo() { std::cout << "foo"; }
virtual void foo1() { std::cout << "foo1"; }
virtual void foo2() { std::cout << "foo2"; }
};
int main(int argc, char* argv[])
{
B b; //add a breakpoint on this line.
return 0;
}
打开组装视图并逐步调试
001D153E lea ecx,[b]
001D1541 call B::B (1D113Bh) //step into
B::B
001D15B0 push ebp
001D15B1 mov ebp,esp
001D15B3 sub esp,0CCh
001D15B9 push ebx
001D15BA push esi
001D15BB push edi
001D15BC push ecx
001D15BD lea edi,[ebp-0CCh]
001D15C3 mov ecx,33h
001D15C8 mov eax,0CCCCCCCCh
001D15CD rep stos dword ptr es:[edi]
001D15CF pop ecx
001D15D0 mov dword ptr [ebp-8],ecx
001D15D3 mov ecx,dword ptr [this]
001D15D6 call A::A (1D1140h) //step into
....
A::A
001D1730 push ebp
001D1731 mov ebp,esp
001D1733 sub esp,0CCh
001D1739 push ebx
001D173A push esi
001D173B push edi
001D173C push ecx
001D173D lea edi,[ebp-0CCh]
001D1743 mov ecx,33h
001D1748 mov eax,0CCCCCCCCh
001D174D rep stos dword ptr es:[edi]
001D174F pop ecx
001D1750 mov dword ptr [ebp-8],ecx
001D1753 mov eax,dword ptr [this]
001D1756 mov dword ptr [eax],offset A::`vftable' (1D782Ch)
001D175C mov eax,dword ptr [this]
1D782Ch是A::vftable的地址,它存储三个相同的地址。
如果某些方法没有body(= 0
),则称为纯虚拟函数。
如果类具有纯虚值,则不能实例化该类。
您需要做的是创建一个实现这些方法的子类
class B : public A
{
virtual int foo(){}
virtual int foo1(){}
virtual int foo2(){}
};
编辑:
如果您当时真的想了解vtable的内容,这里有一篇相关的文章
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- 包含矢量指针的结构的内存释放问题
- 如果以下行不包含决策或分支,GDB 无法单步跳过函数
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- 包含指向其他结构的指针向量的结构
- 删除包含包含动态对象的 STL 容器的智能指针
- C++两个对象,其中包含指向同一数组不同部分的指针
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 为什么 Mac 上不需要包含智能指针?
- 指针数据类型变量如何包含对象?
- cppyy 继承包含智能指针的类
- 为什么 Wild 指针包含零地址而不是 garabge 地址?
- 为包含原始指针的对象C++智能指针
- 遍历包含 c++ 中指针的向量
- 为什么此指针包含存储在堆上的地址
- 为什么指针包含一些垃圾
- 指向结构的指针包含指针
- 指针包含什么类型的数据
- 抽象类的Do变量包含跳转指针
- 为什么变量指针包含相同数据类型的地址?