谈到C和C++最大的不同之处,恐怕就是C++的多态了,通过一个基类指针调用函数的时候,能够知道根据具体的对象去调用合适的函数,如果是Java的话,因为有jvm的存在,我们可以脑补出这样一个画面,基类指针p指向一个对象,首先我们可以判断这个对象的类型,在Java中判断类型是很好实现的(类的信息储存在对象头中),获取到类信息之后,就沿着这个类的继承层次往上找,直到找到一个相同方法签名的方法。那么这个过程在C++中如何实现呢?这一篇就来了解虚函数的实现过程。
讲虚函数先插一个知识点,因为这个知识点和Java中的表现形式有点不一样,看看下面这段程序:
class A
{
public:
void f1() {}
};
class B : public A
{
void f1(int a) {}
};
int main()
{
B *pb = new B();
pb->f1();
return 0;
}
这段程序根本编译不过,为什么?不是在A中有f1()这个方法吗?因为通过pb去调用f1()方法,pb指向B类,所以先从B开始找f1(),找到了一个同名的f1(int a)函数,然后就不会往上找了,因为在C++会有同名覆盖的概念,只要名称相同就不会继续查找,因此编译不通过。
好了,步入正题,C++对象为多态,引入了virtual关键字,一旦这个函数用virtual修饰了,那么在通过指针调用这个方法的时候就会根据特定对象去调用方法了, 没有virtual关键字修饰的方法是没有多