来自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() {};
};
生成一个类似于以下链接的虚拟表:http://www.learncpp.com/images/CppTutorial/Section12/VTable.gif,如上所示。虚拟表有其合理性,毕竟对象需要一种调用函数的方式,并且需要使用函数指针来查找它们。
我不明白的是为什么只有在使用虚拟函数时才需要这样做?我肯定是遗漏了什么,因为虚拟表并不直接依赖于虚拟函数。
例如,如果正在使用的代码是:
class Base
{
public:
void function1() {};
void function2() {};
};
...
Base b;
b.function1();
如果没有虚表(意味着没有指向函数所在位置的指针),那么b.function1()
调用会如何解决?
或者说,在这种情况下,我们是否也有一个表,只是它不被称为虚表?如果是这样,那么问题就出现了:为什么我们需要一种新的虚函数表?