为什么只有虚拟功能才需要虚拟表?

Laz*_*zer 3 c++ virtual-functions vtable

来自http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/,代码如

class Base
{
public:
    virtual void function1() {};
    virtual void function2() {};
};

class D1: public Base
{
public:
    virtual void function1() {};
};

class D2: public Base
{
public:
    virtual void function2() {};
};
Run Code Online (Sandbox Code Playgroud)

生成类似于http://www.learncpp.com/images/CppTutorial/Section12/VTable.gif的虚拟表: 在此输入图像描述

上面的虚拟表是有道理的.所有对象都需要一种方法来调用函数,并且需要使用函数指针来查找它们.


我不明白为什么只有在使用虚拟功能时才需要这个?我肯定遗漏了一些东西,因为虚拟表不直接依赖于虚函数.

例如,如果使用的代码是

class Base
{
public:
    void function1() {};
    void function2() {};
};

...

Base b;
b.function1();
Run Code Online (Sandbox Code Playgroud)

并且没有虚拟表(意味着没有指向函数所在位置的指针),b.function1()调用将如何解决?


或者在这种情况下我们有一个表,只是它不被称为虚拟表?在这种情况下,会出现一个问题,为什么我们需要一种新的虚函数表?

Lig*_*ica 9

[If]没有虚拟表(意味着没有指向函数所在位置的指针),b.function1()调用将如何解决?

编译器内部有一个"指针",因为它正在解析和分析您的代码.编译器决定函数将在何处生成,因此它知道如何解析对该函数的调用.与链接器一致,这一切都在构建过程中整齐地发生.

唯一原因,这不适合工作virtual的功能是的功能调用取决于仅在运行时已知的类型; 实际上,相同的函数指针在虚拟表中逐字存在,由编译器写入.只是在这种情况下,有多个可供选择,并且在编译器完全不参与之后,它们不能被选择(读取:可能是几个月甚至几年!).