2017-09-04 6 views
0

Typeは仮想メソッドを持ち、vtableを持っています。ただし、Type :: Bar()は仮想ではありません。 Bar()を呼び出すと、呼び出しはvtableのメカニズムを経由するか、Foo()にのみ適用されますか?クラスにいくつかの仮想メソッドがある場合、そのメソッドはすべてvtableを使用しますか?

struct Base { 
    virtual void Foo() {} 
} 

struct Type : Base { 
    void Foo() override {} 
    void Bar() {} 
} 

Base* b = new Type(); 
Type* t = static_cast<Type*>(b); 
t->Bar(); // Does this use a vtable? 
+1

単語を結合し、完全にそこにそれらが含まれていますが、する必要は確かにありませんが、 'vtable'は正確に表示されます*ゼロ* ISO Cの時刻++標準、実装の詳細です。したがって、あなたが興味のある*実装*を指定する必要があります。 – paxdiablo

+0

@paxdiablo vtablesを使用しないか、vtablesを非仮想関数に使用するか、あるいはvtablesを非常に異なる方法で実装する実装について知っていますか? – curiousguy

+1

@curiousguy:いいえ、私はしません。しかし、標準の全ポイントは特定のものをロックすることであり、標準がロックダウンしていないものであれ、実装は自由に行うことができます。 – paxdiablo

答えて

3

しかし、Type::Bar()virtualではありません。 Bar()を呼び出すときには、vtableのメカニズムも使用されますか、またはFoo()にのみ適用されますか?

virtual関数を呼び出す関数は、コンパイル時に決定されます。したがって、非virtual関数への呼び出しをディスパッチするためにvtableを選択する実装には正当な理由はありません。しかし、標準では、virtual機能でも、実装がvtableを使用することを禁止していません。

@EJPは良いことを言った:

標準は、仮想関数のためにvtableのに使用する実装を必要としません。実装の詳細です。 vtableを使用した実装では、非仮想関数を含めることでスペースを無駄にすることはありません。

+4

標準では、 'virtual'関数に' vtable'を使う実装が必要ないと言う方がより正確でしょう。実装の詳細です。 'vtables'を使った実装は、' virtual '以外の関数を含めることでスペースを無駄にすることはありません。 – EJP

1

vtableという概念は、C++標準で詳しく説明されていない実装の詳細です。

しかし、クラスに設けた非仮想関数が存在する場合、コンパイル時に呼び出し

関連する問題