これは一例で理解することは時々簡単です:だから
class PureVirtual {
public:
virtual void methodA() = 0;
virtual void methodB() = 0;
};
class Base : public PureVirtual {
public:
virtual void methodA();
void methodC();
private:
int x;
};
class Derived : public Base {
public:
virtual void methodB();
private:
int y;
};
、それはのように見えるかもしれない派生型のオブジェクト与えられた:見て何か「派生」タイプのためのVtableで
------------
Known offset for vtable | 0xblah | -------> [Vtable for type "Derived"]
------------
Known offset for x | 3 |
------------
Known offset for y | 2 |
------------
like:
"methodC"は仮想ではないため、vtableにはありませんまったく。また、クラスDerivedのすべてのインスタンスは、同じ型の共有vtableオブジェクトへのvtableポインタを持つことにも注意してください。
C++とJavaの実装はわずかに異なりますが、アイデアは互換性がありません。主な違いは、概念的な観点からは、Javaメソッドは「final」と宣言されていない限り「仮想」であるということです。 C++では、関数vtableに明示的にキーワード "virtual"を指定する必要があります。 vtableにないものは、オブジェクトの実行時の型ではなくコンパイル時の型を使用して送出されます。
注 - C++のすべてのクラスにvtableがあるわけではありません。仮想関数を持つものだけが持っています。仮想関数がない場合、すべてのメソッドを(コンパイル時に)静的にバインドすることができ、実行時にディスパッチ・メカニズムは不要です。 – eran