为什么C++中的虚函数表指针(vfptr)不能是静态的?

2024-01-10

如果类的所有对象的虚函数表都是相同的,那么为什么指向该表的指针(vfptr)不能是静态的并在所有对象之间共享?


vtable本质上是静态的。但是您实际上需要对象内部的 vptr 成员来执行虚拟调度和其他 RTTI 操作。

在 vptr 实现上,此 C++ 代码:

class Base {
public:
    virtual void f();
};

class Derived : public Base {
public:
    virtual void f();
};

其行为可能类似于这样:

class Base {
public:
    Base::Base() : m_vptr(&Base_vtab) {}
    Base::Base(const Base& b) : m_vptr(&Base_vtab) {}
    void f() { (m_vptr->f_impl)(this); }
protected:
    struct VTable {
        void (*f_impl)(Base* self);
    };
    const VTable* m_vptr;
    static const VTable Base_vtab;
private:
    static void Base_f(Base* self);
};

const Base::VTable Base::Base_vtab = { &Base::Base_f };

class Derived : public Base {
public:
    Derived::Derived() : Base() { m_vtpr = &Derived_vtab; }
    Derived::Derived(const Derived& d) : Base(d) { m_vptr = &Derived_vtab; }
    Derived::~Derived() { m_vptr = &Base::Base_vtab; }
protected:
    static const VTable Derived_vtab;
private:
    static void Derived_f(Derived* self);
    static void Derived_f(Base* self) { Derived_f(static_cast<Derived*>(self)); }
};

const Base::VTable Derived::Derived_vtab = { &Derived::Derived_f };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么C++中的虚函数表指针(vfptr)不能是静态的? 的相关文章

随机推荐

  • 如何在 highcharter 中悬停时获得系列突出显示?

    Highcharts 具有这个巧妙的功能 当将鼠标悬停在柱形图中的条形上时 整个系列都会突出显示 最好实时查看here https www highcharts com demo column negative 在 R 包装器中highch
  • 使用 dev_appserver.py 进行覆盖不包括我的项目文件

    我运行以下命令覆盖范围3 6 https pypi python org pypi coverage Appengine 1 8 0 64 位 Ubuntu 13 04 上的 Python 2 7 4 coverage run dev ap
  • 如何在 C# 中检测任何 Excel 单元格的更改?

    我正在编写一个 Excel VSTO 插件 并且希望获取特定工作表中的单元格更改事件 如何才能做到这一点 检查Excel Application SheetChange事件处理程序 基本上 只要任何工作表中的任何单元格发生更改 它就会触发
  • 使用 Carrierwave 重命名上传的文件

    我正在使用 Carrierwave 上传文件 并且可以正常工作 我的问题是尝试更改上传文件的名称 在生成的 uploader rb 中有一个我认为我应该使用的方法 def filename something jpg if original
  • vim 键映射参考

    我刚刚安装了 command t 插件以及将其映射到 cmd t 而不是 Leader t 的内容 我对 vim 相当陌生 我不知道按键映射的符号是什么 在哪里可以找到在 vim 中映射组合键时使用的符号的参考 vim 的一个原则是 未记录
  • 如何在 javascript 中从弹出窗口进行打印?

    我有一个 Net 应用程序 它动态创建一个小型 HTML 页面 并使用 javascript document open 方法将其弹出在新窗口中 具有该功能的一切都工作正常 现在我想向打印该页面的 HTML 页面添加一个按钮 我尝试使用以下
  • Boolean.TRUE == myBoolean 与 Boolean.TRUE.equals(myBoolean)

    是否有过使用的情况equals Boolean and 处理时会返回不同的结果Boolean物体 Boolean TRUE myBoolean Boolean TRUE equals myBoolean 我在这里考虑的不是原始类型 而是布尔
  • 如何将 JFrame 放入 Java Swing 中现有的 JPanel 中?

    I have an open source java swing application like this http i47 tinypic com dff4f7 jpg http i47 tinypic com dff4f7 jpg 您
  • Wix - 安装然后运行 ​​powershell 脚本

    我知道有几篇关于 Wix 和 PowerShell 脚本的帖子 但在尝试了这些帖子中的解决方案后 我仍然没有得到我想要的结果 为了解释我的情况 我创建了一个 Wix 安装项目 它将从我的本地计算机 运行 Windows 7 获取 2 个 P
  • 针对特定文件扩展名的 Android 意图过滤器?

    我希望能够从网络下载具有特定扩展名的文件 并将其传递给我的应用程序来处理它 但我无法弄清楚意图过滤器 文件类型不包含在 mimetypes 中 我尝试使用
  • 在 Agda 中对 ST monad 进行建模

    最近这个所以问题 https stackoverflow com questions 33975270 can a st like monad be executed purely without the st library促使我在 Ha
  • 使用 Wordpress Super Cache 从缓存中排除动态值

    我正在使用超级缓存插件 一段时间以来 我一直在寻找解决方案 但没有成功 我需要禁用文件中一个函数的缓存functions php add shortcode custom counter example shortcode function
  • Webpack - Yaml -> JSON -> 提取文件

    我有一个包含一些翻译的 YAML 文件 我需要将这些文件转换为 JSON 文件 我尝试过使用yaml import loader and json loader但我收到错误 这是我的设置 const ExtractTextPlugin re
  • Java中的多线程解压

    因此 我尝试在 Java 中对 zip 文件进行只读访问 以多线程方式解压缩 因为我的 ZipFile ZipEntry 标准简单单线程解决方案使用枚举和输入流以及其他结果导致它采取大约需要整整五秒才能将一个 50 兆的 zip 文件解压到
  • Flutter:我应该在哪里调用 SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark)

    在我的 flutter 应用程序中 屏幕 A 没有 AppBar 所以我打电话SystemChrome setSystemUIOverlayStyle SystemUiOverlayStyle dark 在构建中 在另一个具有 AppBar
  • 加载后删除程序集

    我正在尝试使用以下代码加载 MSIL 程序集 string PathOfDll PathOfMsILFile Dll Assembly SampleAssembly SampleAssembly Assembly LoadFrom Path
  • React - 将对象转换为具有属性的对象数组

    我有以下对象 data name 1 a name 2 b name 3 b 如何转换为保留名称和数据 a b 的对象数组 以便我可以为传入名称和数据的每个对象映射和渲染组件 如果您使用reduce函数 您可以执行以下操作来实现您的目标 O
  • 确定实施 sql server 触发器的一些缺点吗?

    我计划在所有 DML 语句上实现触发器以进行日志管理 因此 请确定这样做是否存在一些问题或缺点 我认为这个 SQL Server MVP 博客post http blog sqlauthority com 2007 05 24 sql se
  • 比 Stream.peek() 更好的方法

    peek 主要用于调试 如果我想在流中间调用流上的方法来更改流对象的状态 该怎么办 Stream of Karl Jill Jack map Test new peek t gt t setLastName Doe 我可以做 Stream
  • 为什么C++中的虚函数表指针(vfptr)不能是静态的?

    如果类的所有对象的虚函数表都是相同的 那么为什么指向该表的指针 vfptr 不能是静态的并在所有对象之间共享 vtable本质上是静态的 但是您实际上需要对象内部的 vptr 成员来执行虚拟调度和其他 RTTI 操作 在 vptr 实现上