2016-02-29 80 views
4

我刚看过这个回答How are virtual functions and vtable implemented?。答复的作者使用以下表达式:这是什么意思std :: swap(*(void **)x,*(void **)y)?

std::swap(*(void **)x, *(void **)y); 
// Now x is a C, and y is a B! Hope they used the same layout of members! 

有人可以解释它是如何工作的?为什么和什么意思(void **)其次是operator*

+0

这并不好。 [这个问题](http://stackoverflow.com/questions/9040818/how-to-use-void-pointer-correctly)可能会帮助你。 – erip

回答

8

它涉及未定义行为,所以它不能保证工作。

的基本思想是,xy是指向相同的基本类型,在这里该类型具有至少一个虚拟函数的对象的指针,并且其中所述编译器通过将虚表指针中实现的虚拟功能机构在每个对象的最开始处(即在偏移量0处)。这是迄今为止最常见的做事方式。但不是唯一的方法。

的交换然后假定这些虚表指针的大小void*相同。

+0

优秀的答案。 – erip

+0

这也是一个严格的走样违规 –

相关问题