从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()
呼叫决心?
或者我们在这种情况下也有一个表,只是它不被称为虚拟表?在那种情况下,会出现问题,为什么我们需要一种新的虚拟功能表?
请认识到vtable是一个实现细节。语言中对虚拟表格的形式,功能甚至是存在都没有要求。你的编译器可能碰巧使用了一个,它可能看起来像你的图片。但是,再一次,它可能不会。 – 2012-03-02 20:18:13
虚拟派生时你也会得到一个vptr。除此之外,为什么创建一个vptr/vtable,当你不需要它? – PlasmaHH 2012-03-02 21:54:04