- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
class W
{
public:
virtual void f() { cout << "W::f()" << endl; }
virtual void g() { cout << "W::g()" << endl; }
};
class AW : public virtual W
{
public:
void g() { cout << "AW::g()" << endl; }
};
class BW : public virtual W
{
public:
void f() { cout << "BW::f()" << endl; }
};
class CW : public AW, public BW
{
};
Vtable for W
W::_ZTV1W: 4u entries
0 (int (*)(...))0
4 (int (*)(...))(& _ZTI1W)
8 W::f
12 W::g
Vtable for AW
AW::_ZTV2AW: 7u entries
0 0u
4 0u
8 0u
12 (int (*)(...))0
16 (int (*)(...))(& _ZTI2AW)
20 W::f
24 AW::g
VTT for AW
AW::_ZTT2AW: 2u entries
0 ((& AW::_ZTV2AW) + 20u)
4 ((& AW::_ZTV2AW) + 20u)
Vtable for BW
BW::_ZTV2BW: 7u entries
0 0u
4 0u
8 0u
12 (int (*)(...))0
16 (int (*)(...))(& _ZTI2BW)
20 BW::f
24 W::g
VTT for BW
BW::_ZTT2BW: 2u entries
0 ((& BW::_ZTV2BW) + 20u)
4 ((& BW::_ZTV2BW) + 20u)
Vtable for CW
CW::_ZTV2CW: 14u entries
0 0u
4 0u
8 4u
12 (int (*)(...))0
16 (int (*)(...))(& _ZTI2CW)
20 BW::_ZTv0_n12_N2BW1fEv
24 AW::g
28 4294967292u
32 4294967292u
36 0u
40 (int (*)(...))-0x00000000000000004
44 (int (*)(...))(& _ZTI2CW)
48 BW::f
52 0u
Construction vtable for AW (0xb6dbf8c0 instance) in CW
CW::_ZTC2CW0_2AW: 7u entries
0 0u
4 0u
8 0u
12 (int (*)(...))0
16 (int (*)(...))(& _ZTI2AW)
20 W::f
24 AW::g
Construction vtable for BW (0xb6dbf900 instance) in CW
CW::_ZTC2CW4_2BW: 13u entries
0 4294967292u
4 4294967292u
8 0u
12 (int (*)(...))0
16 (int (*)(...))(& _ZTI2BW)
20 BW::f
24 0u
28 0u
32 4u
36 (int (*)(...))4
40 (int (*)(...))(& _ZTI2BW)
44 BW::_ZTv0_n12_N2BW1fEv
48 W::g
VTT for CW
CW::_ZTT2CW: 7u entries
0 ((& CW::_ZTV2CW) + 20u)
4 ((& CW::_ZTC2CW0_2AW) + 20u)
8 ((& CW::_ZTC2CW0_2AW) + 20u)
12 ((& CW::_ZTC2CW4_2BW) + 20u)
16 ((& CW::_ZTC2CW4_2BW) + 44u)
20 ((& CW::_ZTV2CW) + 20u)
24 ((& CW::_ZTV2CW) + 48u)
每个条目是什么:
Vtable for AW
AW::_ZTV2AW: 7u entries
0 0u // whats this for???
4 0u // ?
8 0u // ?
Vtable for CW
CW::_ZTV2CW: 14u entries
0 0u // ?
4 0u // ?
8 4u // what is the significance of this ???
12 (int (*)(...))0
16 (int (*)(...))(& _ZTI2CW)
20 BW::_ZTv0_n12_N2BW1fEv // ?
24 AW::g
28 4294967292u // ?
32 4294967292u // ?
36 0u // ?
40 (int (*)(...))-0x00000000000000004 // some delta
44 (int (*)(...))(& _ZTI2CW)
48 BW::f
52 0u // ?
CW *pcw = new CW;
AW *paw = pcw;
paw->f(); // Invokes B::f why not w::f
paw 指向 AW 的 vtable,它有一个条目 W::f。 B::f() 是如何被调用的?
类似地:
BW* pbw = pcw;
pbw->g(); // invokes AW::g() why not w::g ???
VTT有什么用,怎么用。 AW 的 VTT 包含指向 AW 的 vtable 的指针
AW::_ZTT2AW:2u 个条目
0 ((& AW::_ZTV2AW) + 20u)
4 ((& AW::_ZTV2AW) + 20u)
并且偏移量 0 和 4 处的两个条目都指向 vtable 基地址+20 u = W::f。为什么两个条目都指向基类的同一个函数?
最佳答案
首先,你所做的是菱形继承(钻石问题),通常是一个坏主意(有些人甚至说邪恶)。
现在,名称以经过修饰的格式显示:您可以使用 c++filt 进行分解。
例如:BW::_ZTv0_n12_N2BW1fEv
表示 BW::virtual thunk to BW::f()
=> 这可能会帮助你理解
现在,关于你的例子paw
指向一个 CW 类。爪子->f()
将调用 CW::f,无论您使用兼容类以何种方式对其进行转换(这就是虚拟对象实现接口(interface)的目的)。
希望这对您有所帮助,目前无法提供更多信息。
关于c++ - 破译 g++ vtable 转储所需的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4630939/
我正在尝试用 Python 破译标准的“a = 1, b = 2, c = 3...”密码,但我有点卡住了。我想要解密的消息是“he”——“8 5”,但由于我的 if 语句的顺序,输出是“eh”。有人
所以我正在编辑代码,并且有一段代码完全没有注释,所以我担心对其进行任何更改,这一切都是从这个 while 语句开始的。 有人能破译这个吗?从技术上描述这是在说什么/在做什么,我相信我能弄清楚我理解第一
好的,所以我在 Haskell 中有这段代码: data Bigit = O | I deriving (Show,Eq) add x y = reverse $ addC O (reverse x)
我继承了一个 BASIC 脚本,我正在尝试将其重写为 Python。我不知道 BASIC,甚至不知道这是哪个版本的 BASIC。是 Visual Basic 吗?请帮我翻译这段代码。 'County
我对 puppet 很陌生,只是想了解输出告诉我的内容。我有一个非常简单的 init.pp 文件来配置 shudders 文件: class sudo { package { sudo:
下面这段代码是为了演示一段OSGi代码中可能发生的死锁,直接取自免费下载的书籍:osgi in practice (Neil Bartlett) 。这本书总体上很容易理解,而且我发现它非常有用。但是,
我正在玩 vim-ruby 缩进,那里有一些非常复杂的正则表达式: " Regex used for words that, at the start of a line, add a level o
我继承了一个 BASIC 脚本,我正在尝试将其重写为 Python。我不知道 BASIC,甚至不知道这是哪个版本的 BASIC。是 Visual Basic 吗?请帮我翻译这段代码。 'County
我在逆向此代码以从 qwerty 解密回 abc 时遇到问题。 我不知道从哪里开始。我尝试用包含 ABC 的字符串替换索引...我还尝试将密文交换为 abc 并将索引更改为 qwerty,但无济于事。
我正在尝试设置一个 cron 作业,我收到了以下命令:wget -0 - -t 1 但我无法完全弄清楚如何使用此资源: http://www.computerhope.com/unix/wget.ht
这个问题在这里已经有了答案: tkinter creating buttons in for loop passing command arguments (4 个答案) 关闭 8 个月前。 我一直
我是 CMake 的新手(通常对 Makefiles、C 和 C++ 还是相当陌生)。我的任务是将我们当前的构建系统更改为使用 CMake 生成 Makefile 并编译我们的代码的系统。我在破译 C
我正在“玩”C++ 中的虚拟继承,我想知道一个类对象是如何布局的。我有这三个类: class A { private: int a; public: A() {this->a = 47
我正在尝试解读与 clr20r3 关联的 P1...P10 参数的含义,当我的应用程序遇到异常时,这些参数会写入事件日志。 我所拥有的最好的been able to find是: P1:托管进程(例如
我有一个带有 postgresql 后端的 Django 网络应用程序,用户可以在其中聚集并互相发送消息。这些消息可以被赞成或反对。如果有任何滥用行为,有很多反对票的人会得到“ghost banned
源代码 class W { public: virtual void f() { cout f(); // Invokes B::f why not w::f paw 指向 AW 的 vtable
我记得曾经看到一个网站,它破译了复杂的 C++ typedef,包括返回函数指针的函数指针,这些函数返回一个数组...... 它将把这样的定义变成可读的英文文本:»指向函数的指针,返回一个 int 指
我有这个 DIV 标签,其中有一个类定义。 我搜索了整个元素,但使用文本搜索功能在任何地方都找不到这个类。 目前,DIV 太宽了,我需要将其缩小一点。 每当我删除 class="clear
所以......我可以理解matlab函数句柄及其目的。但有时,当它变得过于神秘时,我需要帮助来进一步阐述它。 从默认 MATLAB documentation 中获取此示例,说: f = @(x)x
我正在尝试从 VB6 应用程序调用 TAPI32.dll 上的函数。我不知道如何在 VB6 中指定信息并调用它。所以,这个问题问的是帮助破译MSDN中的C++相关信息,并在VB6中调用它,但我在下面详
我是一名优秀的程序员,十分优秀!