C++多态和虚函数(I)

Posted on Thu 07 February 2019 in programming

什么是多态

多态是C++面向对象编程的一个重要概念,它允许使用相同的接口来调用不同的方法。比如,当类之间存在继承关系时,指向基类的指针调用虚函数时,会根据对象的实际类型来调用相应的函数。

什么是虚函数

在C++中,虚函数是一种特殊的函数,它在基类中被声明,并在派生类中被重写。虚函数的主要目的是实现多态性,即允许我们使用基类的指针或引用来调用派生类中的函数。

虚函数的声明方式是在函数的声明前面加上关键字virtual。例如,virtual void func();就是一个虚函数的声明。在派生类中重写虚函数时,可以不用再次使用virtual关键字,但是函数的返回类型、函数名和参数列表必须与基类中的虚函数完全相同。

当我们通过基类的指针或引用调用虚函数时,会发生动态绑定,也就是说,实际调用的函数是由指针或引用所指向对象的实际类型决定的。例如,如果基类指针指向的是派生类对象,那么调用的就是派生类中的虚函数。

虚函数的使用使得我们可以在不知道对象具体类型的情况下,通过基类的指针或引用来调用派生类中的函数,从而实现多态性。这在编写一些需要处理多种类型对象的代码时非常有用,可以提高代码的灵活性和可扩展性。

什么是虚函数表

在C++中,虚函数表是一种用于实现动态多态性的机制。每一个包含虚函数的类(或者说,每一个多态类)都有一个虚函数表。这个表是编译器自动创建的,其中包含了类中虚函数的地址。

每一个多态类的对象都有一个指向虚函数表的指针,通常这个指针是存储在对象的内存空间中的。当我们通过基类的指针或引用调用虚函数时,编译器会根据这个指针找到虚函数表,然后在表中查找对应的虚函数,然后调用这个函数。这就是动态绑定的过程。

虚函数表是C++实现动态多态性的关键。它使得我们可以在运行时根据对象的实际类型来调用相应的虚函数,这在编写一些需要处理多种类型对象的代码时非常有用,可以提高代码的灵活性和可扩展性。