虚函数表与虚函数指针
时间: 2023-11-07 19:55:41 浏览: 120
虚函数表是一个存放虚函数地址的数组,它属于带有虚函数的类。对于一个含有虚函数的类,编译器会在该类的虚函数表中为每个虚函数分配一个地址。当类的对象被实例化后,该对象会拥有一个指向虚函数表的指针,即虚函数指针。通过虚函数指针,对象可以在运行时调用正确的虚函数,实现多态性。
基类的虚函数表中包含了基类的虚函数的地址,派生类的虚函数表会继承基类的虚函数表,并在后面添加自己的虚函数地址。如果派生类还继承了其他含有虚函数的基类,它的虚函数表也会继承这些基类的虚函数表,并按照相同的顺序添加自己的虚函数地址。
当存在多重继承时,一个类可能会有多个虚函数表。每个虚函数表对应于一个含有虚函数的基类。因此,多重继承的类会拥有多个虚函数表,每个虚函数表包含了相应基类的虚函数地址。
相关问题
虚函数表和虚函数指针
虚函数表(Virtual Function Table)是一张存储了虚函数地址的表格。每个包含虚函数的类都会有一张对应的虚函数表。该表的每一项都是一个虚函数的地址。这个表是属于类的,而不是属于某个具体的对象,因此一个类只需要一张虚函数表。
虚函数指针(Virtual Function Pointer),也称为vfptr,是指向虚函数表的指针。在一个对象的内存布局中,虚函数指针位于最前端。通过虚函数指针,对象可以在运行时动态地调用正确的虚函数。
具体来说,虚函数指针指向了对象所属类的虚函数表的首地址。通过这个虚函数指针,对象可以访问到自己所属类的虚函数表。而虚函数表中的每一项都是一个虚函数的地址,通过这个地址,对象可以调用对应的虚函数。
总结起来,虚函数表是一张存储了虚函数地址的表格,属于类而不是对象。虚函数指针是指向虚函数表的指针,位于对象的内存布局的最前端。通过虚函数指针,对象可以在运行时动态地调用正确的虚函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [虚函数表及虚函数表指针(看似简单,深入部分也不是很懂)](https://blog.csdn.net/fengdijiang/article/details/106737667)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [虚函数指针和虚函数表](https://blog.csdn.net/hrbust_cxl/article/details/117393978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
虚函数表,虚函数指针
虚函数表(virtual function table)是用于实现多态性的一种机制。在C++中,如果一个类中声明了虚函数,编译器会为该类生成一个虚函数表。虚函数表是一个存储了虚函数地址的数组,每个类有且仅有一个对应的虚函数表。在对象被创建时,会在对象的内存空间中插入一个指向该类虚函数表的指针(也称为虚函数指针)。通过虚函数指针,可以在运行时动态调用对象的虚函数。
当一个类被继承时,派生类会继承基类的虚函数表,并且可以在自己的虚函数表中添加新的虚函数或重写基类的虚函数。这样,在派生类对象上调用虚函数时,会根据对象的实际类型找到对应的虚函数地址,实现动态绑定。
阅读全文