C++虚函数的作用是什么

一、C++虚函数的作用

C++虚函数的作用是实现动态多态,即让基类的指针或引用能够根据实际指向的对象类型来调用相应的成员函数。虚函数可以在子类中被覆盖(重写),从而实现多态。

在 C++ 中,如果一个成员函数被声明为虚函数,那么在派生类中对该函数的实现会覆盖掉基类中的实现。这样,在使用指向基类对象的指针或引用调用虚函数时,实际上会调用派生类中的实现,而不是基类中的实现。

二、C++虚函数的定义

C++虚函数定义是在类成员函数的声明前加上virtual关键字,表示该函数可以在子类中被重写。例如:

class Base {

public:

    virtual void func(); // 虚函数

};

三、C++虚函数原理

C++虚函数原理是通过虚函数表和虚函数表指针来实现的。每个含有虚函数的类都有一个虚函数表,存放着该类的所有虚函数的地址。每个含有虚函数的对象都有一个虚函数表指针,指向该对象所属类的虚函数表。当通过基类指针或引用调用虚函数时,会根据指针或引用实际指向的对象类型,在其对应的虚函数表中查找要调用的函数地址。如果子类重写了父类的某个虚函数,那么在子类的虚函数表中,该位置会被替换为子类重写后的版本。

四、纯虚数的定义

纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

纯虚函数也可以叫抽象函数,一般来说它只有函数名、参数和返回值类型,不需要函数体。这意味着它没有函数的实现,需要让派生类去实现。

C++中的纯虚函数,一般在函数签名后使用=0作为此类函数的标志。java、C#等语言中,则直接使用abstract作为关键字修饰这个函数签名,表示这是抽象函数(纯虚函数)。

纯虚函数定义是在虚函数后加上=0,表示该函数没有实现,必须在子类中被重写。例如:

class Base {

public:

    virtual void func() = 0; // 纯虚函数

};

五、什么是虚函数表

虚函数表(Virtual Table)简称为V-Table。在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平