- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
vptr -- 虚表指针
vtbl——虚拟表
问题1>vptr与类的对象相关联是否正确?
问题2>vtbl与类关联是否正确?
问题 3> 它们如何真正协同工作?
谢谢
最佳答案
请注意 vptr
和 vtbl
是实现定义的 C++ 标准甚至没有谈论它们。然而,大多数已知的编译器通过 vptr
和 vtbl
实现动态调度。
问题一:vptr
与类的对象相关联是否正确?
是vptr
与包含Atleast one
虚拟成员函数的类的对象相关联。编译器将 Vptr 添加到 多态
类的每个对象(包含至少一个虚成员函数)this
指针的前 4 个字节然后指向 vptr
问题2:vtbl
与类关联是否正确?
是Vtbl
与类关联。为每个 Polymorphic
类创建一个 vtbl
。
问题 3:它们如何真正协同工作?
编译器为多态类的每个对象添加一个vptr
,并为每个类创建一个vtbl
。 vptr
指向 vtbl
。 vtbl
包含该类中所有虚函数的地址列表。如果派生类覆盖基类的虚函数,则 vtbl
中该特定函数的地址条目将替换为被覆盖函数的地址。在运行时,编译器根据指针内部的地址而不是指针的类型遍历特定类(Base 或 Derived)的 vtbl
,并调用 vtbl
中的函数地址>。从而实现了动态多态。
这种动态多态的代价是:fetch
(获取里面的vptr) fetch
(从vtbl中的函数列表中获取函数地址) Call
(调用函数)
相对于调用
(静态绑定(bind)后直接调用函数)。
关于C++——与对象或类相关联的 vptr 和 vtable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5467956/
我正在阅读 Inside C++ Object Model 一书中与对象破坏相关的主题并遇到了这个问题。 它表示在执行用户自定义析构函数之前,析构函数将被扩充。扩充的第一步是将 vptr 指针重置为该
在许多资料中,书籍等都写着“不要在子类构造函数中调用 this->virtualFunction”,并且在一些资料中解释了为什么你不能这样做。因为目前根本没有创建构造类。因此,将从子构造函数调用的虚函
我有一个带有虚拟析构函数的类“base”,因此其中有一个 VTable 和相应的 VTPR,以及一个从它派生的类: class base { public: virtual ~base() {
为什么我们不对非虚函数使用相同的方法? 我的意思是,为什么我们要那样使用虚函数?我们不能将它们用作非虚拟的并覆盖它们吗? 如果这种方法可以节省我们的时间/空间或其他任何东西,为什么我们不对非虚函数使用
vptr 索引应该显示所有虚函数,但在我的例子中,3 个虚函数中只显示了 2 个。 我在下面提供完整的代码和屏幕截图:- 类头.h #include using namespace std; //
class base { public: void virtual fn(int i) { cout fn(i); cout fn(i) 调用;没事。 我的观点是,如果
我在看 this article ,它说“进入基类析构函数后,该对象成为基类对象,并且 C++ 的所有部分——虚函数、dynamic_casts 等——都以这种方式对待它。”这是否意味着 vptr 在
这与之前的许多问题类似,但它提出了一些我无法找到答案的问题。 #include using namespace std; class Base1 { public: int
最近,我一直在阅读“inside the c++ object model”。它说 vptr 在调用基类的构造函数后初始化。所以我进行了测试: class A { public: A(int
以上是一道面试题。 据我了解,作为虚拟分派(dispatch)机制的一部分,编译器会为每个类创建一个vTable,并在编译期间插入一个额外的指针(vptr)。但是它究竟是什么时候将类的虚拟表分配给这个
在c++中,我们在每个对象中都有VPTR,但每个类只有一个VTABLE。为什么 VPTR 在每个对象中?是不是重复了? 最佳答案 如果没有运行时类型信息,您将不知道对象属于哪个类。因此,为了调用方法,
有些东西我还是不明白。 对于我声明的每个类,都有一个指向类虚拟表的隐藏 vptr 成员。 假设我有这个声明: class BASE { virtual_table* vptr; //that'
根据 MSDN,__RTDynamicCast() function用于在 Visual C++ 中实现 dynamic_cast。它的参数之一是 LONG VfDelta,它被描述为“对象中虚函数指
任何具有虚函数的类都会获得一个额外的隐藏指针,该指针将指向最派生的类。 这个vptr的类型是什么? 最佳答案 它没有类型。这是标准未指定的实现细节; 它不是语言的一部分。 请注意,C++ 根本没有说必
我想知道是否存在编译器不需要将 vptr 分配给实例化对象的可能优化,即使该对象的类型是具有虚方法的类。 例如考虑: #include struct FooBase { virtual void
我正在上计算机安全课并且正在阅读 http://phrack.org/issues/56/8.html .在 bo3.cpp 中,作者创建了他自己的 VTABLE,并覆盖 VPTR 以指向他的 VTA
我有几个类(class),我试图了解 vptr 和 vtable 在这种情况下是如何工作的。 class RGB { short value[3]; }; class AbstractImage{
我想知道为什么在此处的一种情况下我在 delete 部分得到异常,而在另一种情况下却没有。 没有异常(exception)情况 #include using namespace std; class
对于一些编译器,如果一个类有虚函数,那么它的 vptr 可以用它的对象的第一个字节的地址来访问。例如, class Base{ public: virtual void f(){cout<<"
这个问题不是关于 C++ 语言本身(即不是关于标准),而是关于如何调用编译器来实现虚函数的替代方案。 实现虚函数的一般方案是使用指向指针表的指针。 class Base { private:
我是一名优秀的程序员,十分优秀!