0

次のコードでは、ポインター変換と多重継承はどのように連携しますか?

class Foo {
  public:
  virtual void someFunc();
};

class Bar;


void someWork(Bar *bar) {
  ((Foo*) bar)->someFunc();
}

class Bar: public Zed, public Foo {
...
virtual void someFunc() { ... do something else ... }
}

Bar bar;

int main() {
  someWork(&bar);
}

私の理解はちょっと不安定です。

一方では、someWorkはBarについて何も知らないので、これは機能しないはずです。しかし一方で、私は前方宣言されたBarを持っています。

ありがとう!

4

2 に答える 2

5

これは機能せず、あなたが思っていることを完全に実行していません。cスタイルのキャストの使用:

(Foo*) bar

この場合は正しくありません。あなたがやろうとしていることは、Bar*をaにアップキャストすることですFoo*(つまり、static_cast派生クラスへのポインタから基本クラスへのポインタへのポインタを実行します)。

ただし、現時点ではの定義がBar利用できないため、コンパイラはそれFooがの基本クラスであることを認識していませんBar。したがって、static_cast失敗し、コンパイラはフォールバックして、を使用しますがreinterpret_cast、これはまったく同じではありません。

于 2010-01-31T06:05:09.460 に答える
0

うーん。私の推測では、キャストはリンク中に「評価」されるため、クラスがコンパイルされた後です。しかし、それは単なる推測です。

于 2010-01-31T06:00:24.670 に答える