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()调用将如何解决?
或者在这种情况下我们有一个表,只是它不被称为虚拟表?在这种情况下,会出现一个问题,为什么我们需要一种新的虚函数表?
[If]没有虚拟表(意味着没有指向函数所在位置的指针),
b.function1()调用将如何解决?
编译器内部有一个"指针",因为它正在解析和分析您的代码.编译器决定函数将在何处生成,因此它知道如何解析对该函数的调用.与链接器一致,这一切都在构建过程中整齐地发生.
该唯一原因,这不适合工作virtual的功能是它的功能调用取决于仅在运行时已知的类型; 实际上,相同的函数指针在虚拟表中逐字存在,由编译器写入.只是在这种情况下,有多个可供选择,并且在编译器完全不参与之后,它们不能被选择(读取:可能是几个月甚至几年!).
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |