基础:
直接调用在反汇编里 Call的是一个地址 硬编码为E8…。
间接调用在反汇编里是Call [] 硬编码一般为FF …
什么是虚函数?
虚函数就是函数面前加个virtual
观察虚函数的调用方式->
通过创建对象的方式观察虚函数
演示代码
#include <iostream>
using namespace std;
class Base {
public:
void Function_1() {
cout << "函数1" << endl;
}
virtual void Function_2() {
cout << "函数2" << endl;
}
};
int main() {
Base base;
base.Function_1();
base.Function_2();
return 0;
}
我们在这里下个断点
跳到反汇编(在VS内直接右键找到转到反汇编即可)
通过反汇编我们可以看到
通过对象的方式调用在内部虚函数和普通函数是没区别的
通过指针方式观察虚函数
Main函数内代码
int main() {
Base base;
Base * PB;
PB = &base;
PB->Function_1();
PB->Function_2();
return 0;
}
可以观察到反汇编代码不一样
通过指针调用虚函数时 他是间接调用
总结:
1.通过对象调用时,virtual函数与普通函数都是E8 Call
2.通过指针调用时,virtual函数是FFCall 也就是间接Call