從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