这是什么意思std :: swap(*(void **)x,*(void **)y)?

时间:2016-02-29 01:30:01

标签: c++

我刚读过这个答案How are virtual functions and vtable implemented?。响应的作者使用以下表达式:

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*

1 个答案:

答案 0 :(得分:8)

它涉及未定义的行为,因此无法保证其正常工作。

基本思想是$('.student').last() x是指向相同基类型的对象的指针,其中该类型至少有一个虚函数,并且编译器已实现虚函数机制通过在每个对象的最开始处(即在偏移0处)放置 vtable指针。这是迄今为止最常见的做事方式。但不是唯一的方法。

然后交换假定这些vtable指针的大小与y相同。