问题标签 [vptr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
272 浏览

c++ - C++ 需要虚拟表吗?

我最近对 ​​C++ 虚拟表有疑问。

为什么 C++ 使用虚拟表

=>因为C++编译器不知道实际的函数地址

--->为什么?

=>因为 C++ 编译器不知道指针“panimal”指向的对象的确切类型(猫?狗?动物?)

- -为什么?这是编译器可以找出对象类型的任何方式吗?

=>是的,我认为编译器可以通过跟踪对象类型来实现。

让我们考虑一下对象指针获取其值的来源。确实有2个来源。

  1. 另一个指针
  2. 类实例的地址“另一个指针”在哪里获得它的值?最终,有一个指针从“类实例”中获取它的值。

因此,通过将分配线程向后跟踪到原始源对象

  => 编译器能够找出指针的确切类型。

  =>编译器知道被调用的确切函数的地址

  => 不需要虚拟表。

对象类型跟踪保存每个类实例的虚拟表内存和虚拟表指针。

对象类型跟踪在哪里不起作用?

图书馆链接。

如果库函数返回一个基类指针,编译器就无法追踪到原始源对象。编译器大概可以适应库代码和非库代码。对于导出的库类,使用虚拟表。对于其他类,只需跟踪它们的对象类型以节省内存。

不知道以上说法是否有错误,如有错误请指出。先谢谢了~

0 投票
1 回答
2292 浏览

c++ - C++:如何查看 vptr/vtable 内容

每个具有虚函数的 C++ 对象都有一个指向 vtable 的 vptr。我怎样才能看到这个 vptr 是什么,以及它指向的内容?我知道这取决于编译器,它可以将 vptr 放在对象内存空间的任何位置。但无论如何我能找到它是什么吗?

干杯。

0 投票
1 回答
274 浏览

c++ - 单个 vtable 如何跟踪新的虚拟功能?

我正在使用 VS 2013 并试图查看 vptr 和 vftable 如何在对象级别工作。所以我有以下课程:

这就是我在调试时看到的: 在此处输入图像描述

理论上应该有两个 vptr。一个用于baseClass 的vftable 和一个用于derivedClass 以跟踪新添加的derivedClassOnlyVirtualFunc()。

但正如你所见,只有一个 vptr/vftable。但该机制运作良好。

我以为在监视窗口中看不到第二个 vptr,所以我打印了对象的大小。它是 4 个字节,表示只存在一个指针。

那么这如何与新添加的虚函数一起工作呢?

根据这个应该有两个vptr。

编辑:我按照 Serge 的建议检查了 vftable 的内存内容,确实有三个条目。 在此处输入图像描述 由于某种原因,它没有出现在调试器中。

干杯。

0 投票
2 回答
369 浏览

c++ - C++ 子构造函数和 VPTR

在许多资料中,书籍等都写着“不要在子类构造函数中调用 this->virtualFunction”,并且在一些资料中解释了为什么你不能这样做。因为在构建类的时刻根本没有创建。因此,将从子构造函数调用的虚函数将是基类的函数。这意味着在该类的子构造函数主体中,VPTR 指向基 VTABLE。

所以我的问题是,
当子类的 VPTR 被覆盖以在它的虚拟表上寻址时,对象构造的时刻是什么时候?我猜想一些自动生成的代码会在构造函数主体的末尾或在构造函数主体执行之后执行。

第二个问题是,
为什么在构建结束时会覆盖 VPTR?也许有一些重要的原因?为什么不能在开始构造函数体或构造基类之后覆盖 VPTR?

0 投票
2 回答
94 浏览

c++ - C++:帮助理解这行代码

我正在寻找一种通过指针直接访问 vtable 的方法,并遇到了这篇文章: http: //www.codeproject.com/Tips/90875/Displaying-vtable-when-debugging

它工作正常,我可以通过 vtable 条目调用函数。但是我很难理解这行deo:

ptr是指向对象的指针。我如何破译这一行以及如何vt获得 vtable 地址?

谢谢你。

0 投票
2 回答
1048 浏览

c++ - 确定没有虚拟表指针的对象的大小

是否有一种通用方法(不依赖于平台)在编译时获取内存中类对象的大小,而不计算 vtable 指针?

0 投票
1 回答
286 浏览

c++ - C++ Polymorphism issues. Something to do with _vfptr

I am trying to create a program that has the user click twice on the screen and a rectangle is drawn according to what was clicked.

Right now all I am trying to do is set my classes up to be able to correctly draw a rectangle manually without worrying about where the user clicks.

Eventually my program will be able to draw stuff like circles and triangles so I decided to use Polymorphism and have each shape type (i.e. Rectangle) be its own class that inherits from a class called Shapes.

I then have a class called Game which holds a Shapes object.

Shapes.h

Shapes.cpp

Rectangle.h

Rectangle.cpp

Game.h

The first Game.cpp below is coded in a way of what I am trying to do, but it throws me the error Unhandled exception at 0x001AF742 in Shapes.exe: 0xC0000005: Access violation reading location 0x00000001. After looking into this, I've found that some __vfptr hidden pointer variable (that I think controls virtual stuff) gets set to 0 and causes memory issues.

Note, Click() only gets called when the mouse is pressed, Draw() is called anytime any type of event happens (e.i. mouse press, mouse release, key press, key release etc.) When the mouse is pressed, both events get called, but Click() gets called first.

Also, mTestis the variable that is the Shapes object.

Game.cpp: Doesn't Work

However, what seems to baffle me is if I add a Shape Rectangle to mTest inside of the Draw() function right before I call DrawAll(), it works. However, I want to be able to create the Rectangle depending on where the User clicks, and this method wont allow that.

Game.cpp: Works

0 投票
0 回答
66 浏览

java - C++ 和 Java 中的虚拟机制

我对 C++ 和 Java 中的虚拟机制有一些困惑。以下程序的输出不同。我无法理解为什么?

在 Java 中:

输出是:

在 C++ 中,以下输出:

是:

有人可以解释一下吗?

0 投票
3 回答
519 浏览

c++ - 多重继承中保存在vtable c ++中的覆盖虚拟方法在哪里

在 C++ 中,在运行时没有类表示,但我总是可以在派生类中调用重写的虚拟方法。那个被覆盖的方法保存在 vtable 的哪里?这是一段代码来演示:

D 类对象的内存布局是什么?B1::f 和 B2::f 在该内存布局中保存在哪里(如果它们被保存的话)?

0 投票
2 回答
1358 浏览

c++ - 通过虚拟指针访问成员函数的指针

我遇到了他们解释 vptr 和 vtable 的文章。我知道在存储了虚函数的类的情况下,对象中的第一个指针是指向 vtable 的 vptr,而 vtable 的数组条目是指向函数的指针,其顺序与它们在类中出现的顺序相同(我已经用我的测试进行了验证程序)。但我试图了解编译器必须使用什么语法才能调用适当的函数。

例子:

问题:

1.但我真正想了解的是编译器如何将调用替换ptr->func1()vptr?如果我要模拟通话,我该怎么办?我应该重载->运算符吗?但即使这样也无济于事,因为我不知道这个名字到底是什么func1。即使他们说编译器通过vptr访问vtable,它仍然如何知道的条目func1是第一个数组并且条目func2是数组中的第二个元素?函数名称到数组元素必须有一些映射。

2.如何模拟。您能否提供编译器用于调用函数的实际语法func1(它如何替换ptr->func1())?