我刚读过这个答案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*
?
答案 0 :(得分:8)
它涉及未定义的行为,因此无法保证其正常工作。
基本思想是$('.student').last()
和x
是指向相同基类型的对象的指针,其中该类型至少有一个虚函数,并且编译器已实现虚函数机制通过在每个对象的最开始处(即在偏移0处)放置 vtable指针。这是迄今为止最常见的做事方式。但不是唯一的方法。
然后交换假定这些vtable指针的大小与y
相同。