5

C++では、仮想関数はいつ静的バインディングを使用できますか? ポインターを介してアクセスされているか、直接アクセスされているか、またはまったくアクセスされていないか?

4

3 に答える 3

9

ポインターまたは参照を介して仮想メソッドが呼び出されると、動的バインディングが使用されます。それ以外の場合は、コンパイル時バインディングが使用されます。元:

class C;

void Foo(C* a, C& b, C c) {
  a->foo();  // dynamic
  b.foo();  // dynamic
  c.foo();  // static (compile-time)
}
于 2008-11-06T00:20:10.243 に答える
6

関数の基本クラス バージョンを呼び出したい場合は、基本クラスに明示的に名前を付けることで実行できます。

class Base
{
public:
  virtual ~Base() {}
  virtual void DoIt() { printf("In Base::DoIt()\n"); }
};

class Derived : public Base
{
public:
  virtual void DoIt() { printf("In Derived::DoIt()\n"); }
};

Base *basePtr = new Derived;
basePtr->DoIt();  // Calls Derived::DoIt() through virtual function call
basePtr->Base::DoIt();  // Explicitly calls Base::DoIt() using normal function call
delete basePtr;
于 2008-11-06T00:12:56.827 に答える
2

静的バインディングは、オブジェクトの型がコンパイル時に完全に明確である場合にのみ実行できます。抽象オブジェクトの型が明確な場所は 4 つだけだと思います。コンストラクター、デストラクタ、ローカルで宣言され、動的割り当てと同じスコープ内にある場合です。私は標準をよく知らないので、これら 4 つの可能性について何を言っているのかわかりませんでした (最初の 2 つは静的にバインドされ、3 番目の可能性は静的にバインドされ、最後の 1 つはそうではないと思いますが、おそらく未定義であると言われています)または実装依存)。これらのポイント以外では、基底クラス ポインターを介してアクセスされているオブジェクトが派生クラスを指している可能性があり、現在の翻訳単位にはそれを知る方法がないため、静的バインディングは不可能です。

于 2008-11-06T00:08:00.207 に答える