在C ++中我们需要双重调度/访问者的情况究竟发生了什么

杰伊

我了解解决方案的实现和双重调度/访问者模式,但是我不了解在编译时和运行时我们需要这种模式会发生什么。

例如此代码:

#include <iostream>

class A {
public:
};
class B : public A {
};

class F {
public:
    virtual inline void operator()(const A&) const noexcept {
        std::cout << "FxA" << std::endl;
    }
    virtual inline void operator()(const B&) const noexcept {
        std::cout << "FxB" << std::endl;
    }
};

class G : public F {
public:
    virtual inline void operator()(const A&) const noexcept {
        std::cout << "GxA" << std::endl;
    }
    virtual inline void operator()(const B&) const noexcept {
        std::cout << "GxB" << std::endl;
    }
};

void by_const_ref(const F& f, const A& a) {
    f(a);
}

int main() {
    by_const_ref(F(), A());
    by_const_ref(F(), B());
    by_const_ref(G(), A());
    by_const_ref(G(), B());

    return 0;
}

如果没有双重调度,对by_const_ref的第二次和第四次调用将不会将B()解析为A对象。

从本文开始:https : //en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_in_C++我了解它涉及名称修改以及运行时的编译时和vtable解析,但我没有找到确切的方法。

对于名称修改部分,我查看了已编译的对象,但没有发现任何特殊之处。

对于vtable,我使用g ++ -fdump-lang-class对其进行了转储,并且看起来那里也没有太多信息。

因此,我的要求。我想了解到底发生了什么,以及也许如何检查这种行为(使用nm等工具,检查vtable,机器代码?)

昆汀

您太深入了,这很简单。

C ++虚拟函数可基于单个参数的类型进行动态调度this顾名思义,双重调度是基于两个参数类型的动态调度由于该语言不提供此功能,因此Visitor模式仅使用内置的一次调度两次,this依次使用每个动态参数

可以想象,通过继续进行此音乐椅游戏,直到一次完成所有动态参数this并在最终调用之前正确分配了访问者,才能实现执行三重分配或更多次访问的访客

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我们覆盖 C 中的联合字段时发生了什么?

来自分类Dev

为什么我们需要C ++中的虚函数?

来自分类Dev

当我们在C#中访问字符串的'Length'属性时会发生什么?

来自分类Dev

为什么我们需要对象发送者作为 c# 中的参数事件处理程序?

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

当我们在C ++中更改字符串的值时会发生什么

来自分类Dev

当我们在C中将数字转换为较小的数字时,会发生什么情况?

来自分类Dev

为什么我们需要声明枚举变量?(C)

来自分类Dev

为什么我们需要C ++中的纯虚拟析构函数?

来自分类Dev

为什么我们在C ++中需要飞船<=>运算符?

来自分类Dev

为什么我们需要C中的终止符

来自分类Dev

为什么我们需要在C#中锁定并反对?

来自分类Dev

为什么在C#方法中我们需要多个`await`语句?

来自分类Dev

为什么我们需要C ++中的基本数据类型

来自分类Dev

为什么我们在这个程序中需要虚拟(Turbo C++)?

来自分类Dev

C ++中的双重调度

来自分类Dev

为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针

来自分类Dev

在会计中,我们知道借方发生了什么,贷方发生了什么

来自分类Dev

为什么在C语言的套接字编程中我们需要服务器本身的IP地址

来自分类Dev

为什么我们需要在Windows C ++中链接kernel32.dll,user32.dll等?

来自分类Dev

为什么我们需要在 C++20 中的函数概念参数之后使用 auto?

来自分类Dev

为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

来自分类Dev

仅标题环境中C ++中的访问者模式

来自分类Dev

方法中的变量是否是临时的。那为什么我们可以用C ++访问它们呢?

来自分类Dev

当我们在 C++ 中使用“while”时会发生什么转换?

来自分类Dev

C++17 在并行性方面究竟发生了什么变化?(权威文档在哪里?)

来自分类Dev

为什么我们不能与访问者一起发起活动?

来自分类Dev

在我们的C / C ++程序中,使用espeak需要哪些行?

来自分类Dev

当我们使用右值引用时,究竟发生了什么?std :: move如何工作?

Related 相关文章

  1. 1

    当我们覆盖 C 中的联合字段时发生了什么?

  2. 2

    为什么我们需要C ++中的虚函数?

  3. 3

    当我们在C#中访问字符串的'Length'属性时会发生什么?

  4. 4

    为什么我们需要对象发送者作为 c# 中的参数事件处理程序?

  5. 5

    为什么我们需要在此脚本中调用“ c.set.bind(c)”?

  6. 6

    当我们在C ++中更改字符串的值时会发生什么

  7. 7

    当我们在C中将数字转换为较小的数字时,会发生什么情况?

  8. 8

    为什么我们需要声明枚举变量?(C)

  9. 9

    为什么我们需要C ++中的纯虚拟析构函数?

  10. 10

    为什么我们在C ++中需要飞船<=>运算符?

  11. 11

    为什么我们需要C中的终止符

  12. 12

    为什么我们需要在C#中锁定并反对?

  13. 13

    为什么在C#方法中我们需要多个`await`语句?

  14. 14

    为什么我们需要C ++中的基本数据类型

  15. 15

    为什么我们在这个程序中需要虚拟(Turbo C++)?

  16. 16

    C ++中的双重调度

  17. 17

    为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针

  18. 18

    在会计中,我们知道借方发生了什么,贷方发生了什么

  19. 19

    为什么在C语言的套接字编程中我们需要服务器本身的IP地址

  20. 20

    为什么我们需要在Windows C ++中链接kernel32.dll,user32.dll等?

  21. 21

    为什么我们需要在 C++20 中的函数概念参数之后使用 auto?

  22. 22

    为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

  23. 23

    仅标题环境中C ++中的访问者模式

  24. 24

    方法中的变量是否是临时的。那为什么我们可以用C ++访问它们呢?

  25. 25

    当我们在 C++ 中使用“while”时会发生什么转换?

  26. 26

    C++17 在并行性方面究竟发生了什么变化?(权威文档在哪里?)

  27. 27

    为什么我们不能与访问者一起发起活动?

  28. 28

    在我们的C / C ++程序中,使用espeak需要哪些行?

  29. 29

    当我们使用右值引用时,究竟发生了什么?std :: move如何工作?

热门标签

归档