C++ 虚函数表详解:剖析 Dog 类 bark() 函数调用
#include
class Animal { public: virtual void bark() { cout << 'Animal bark\n' << endl; } virtual void show() { cout << 'Animal show\n' << endl; } };
class Dog : public Animal { public: void bark() { cout << 'Dog bark\n' << endl; } /* virtual void show() { cout << 'Dog show\n' << endl; } */ };
int main() { cout << sizeof(Animal) << endl; Dog wc; for (int i = 0; i < 2; i++) { auto fp = (void ()()) * ((int**)(int**)&wc + i); fp(); } return 0; }
解释它的输出内容:
该程序的输出是:
8 Dog bark
程序中定义了一个 Animal 类和一个 Dog 类,Dog 类是 Animal 类的派生类。Animal 类中有两个虚函数,分别是 bark() 和 show()。Dog 类重写了 bark() 函数。
在主函数中,先输出了 Animal 类的大小,结果为 8 字节。然后创建了一个 Dog 对象 wc。接下来使用循环遍历 wc 对象的虚函数表,通过指针调用虚函数。
循环中的第一次迭代,i 为 0,通过指针操作获取到 Dog 类的虚函数表的第一个函数指针,并将其转换为正确的函数类型。然后调用该函数,输出“Dog bark”。
循环中的第二次迭代,i 为 1,通过指针操作获取到 Dog 类的虚函数表的第二个函数指针,并将其转换为正确的函数类型。然后调用该函数,由于 Dog 类没有重写 show() 函数,所以会调用父类 Animal 的 show() 函数,输出“Animal show”。
因此,程序的输出为:
8 Dog bark Animal show
原文地址: https://www.cveoy.top/t/topic/qsYC 著作权归作者所有。请勿转载和采集!