在C++中虚函数是很重要的一个知识点,对于它,还是感觉似懂非懂,这次写下来当作总结了吧。
虚函数的思想是,根据指向或引用的对象类型调用虚函数,而不是根据指针本身或引用本身的类型,虚拟函数在运行时后期解析。换句话说,存在虚函数的类创建一个指向子类的指针或引用,当该指针指向子类时,可以调用派生类中重载父类的方法,没必要管派生类对象是什么,引用也是如此。具体的代码如下,注释说的很清楚了:
#include <iostream>
using namespace std;
class A
{
public:
virtual void f()
{
cout << "这是 A" << endl;
}
};
class B :public A
{
public:
void f()
{
cout << "这是 B" << endl;
}
void f1()
{
cout << "okokok" << endl;
}
};
int main()
{
/*
这是引用的方式
B b;
A &a = b;
a.f();
*/
B *b = new B();
A *a = b;
a = b; //B类型的指针赋值给A类型的指针,a指向类B
a->f();
//这里只能调用被重写的f(),想要调用f1()需要用到其他方法
system("pause");
return 0;
}
虚函数是如何做到这点的,我从其他地方找到一个比较好的解释,编译器维护了两个表,vptr和vtable,