4

こんにちは、インライン仮想関数がない理由を尋ねることで、友人と話し合いました。

私の答えは、インライン関数はコンパイル時にあり、仮想関数は動的時にバインドされます。コンパイル時に、どの関数が仮想関数を呼び出すかを知る方法はありません。したがって、インライン仮想関数はお勧めできません。

しかし、彼は言った、それは正しくない。

彼の答えは、インライン関数にはアドレスがないため、仮想テーブルではインライン関数のアドレスを配置する方法がないため、インライン仮想関数はありません。

知りたいのは次の3点です。

  1. 私の答えは正しいですか?私の答えは正しいと思います。
  2. インライン関数にはアドレスがありませんか? アドレスがあると思います。
  3. インライン関数にもアドレスがありますが、彼の答えは私のものよりも優れていますか?

本当にありがとう!

4

1 に答える 1

7

私はどちらの答えも好きではありません。

inline関数は、複数回定義できる関数です (ただし、定義は一致する必要があります)。これが、ヘッダー ファイルに入れることができる理由です。他の関数と同じようにアドレスを持っています。

virtual関数は、派生クラスによってオーバーライドできる関数です。

派生クラスによってオーバーライドでき、複数の定義を簡単に持つことができる関数を作成できます。

struct foo {
    virtual void f();
}

inline void foo::f() {}

つまり、どの関数もインライン化できます。つまり、実際の呼び出しではなく、呼び出しの時点でそのコードを挿入できます。これにより、アドレスの取得が妨げられることはありません。inlineコンパイラが静的に解決できる場合は、マークされていない仮想関数でもインライン化できます。

于 2012-08-22T23:52:27.800 に答える