2011-03-18 62 views

回答

3

一般来说,不,标准对于如何实现虚拟调度是不可知的,因此就其而言,virtual类可能甚至没有vptr和vtable。

vptr是一个实现细节,你应该看看你的编译器文档来检查是否有一个文档化的方式来访问它(但我从来没有听说过编译器构建这样做),否则你必须看看装配输出以确定其位置。

出于好奇,你为什么需要访问vptr?

+0

我想在运行时通过代码推送我的一个实现,尽管这仅仅是为了实验目的。 – Zuzu 2011-03-19 08:03:26

2

由于多态性和动态调度的实现是实现特定的,因此没有可移植的方法来做到这一点。

1

许多编译器把vtable指针放在类的开头,所以你可以通过将你的类指针转换为一个指针指针并检索它来得到它。

但是正如已经指出的那样,您必须意识到这是特定于实现的,所以如果您选择不同的编译器版本或不同的目标平台,它可能会随机分裂 - if你很幸运,它会崩溃。如果不是,那么在某个地方会出现一个微妙的错误,你会花费很多时间去尝试调试。

当您在其上使用虚拟继承时,这会变成双倍。

相关问题