17

派生クラスを指す基本クラスのポインターを使用して、派生クラスの仮想関数を呼び出すことができるため、ポインターがポリモーフィック型ではない理由がわかりません。これは、実行時にシステムがポインタがポリモーフィックかどうかを判断できることを示唆していますね。

(これはtypeid for polymorphic typesからのフォローアップの質問です)

4

2 に答える 2

8

あなたの質問は、用語の不適切な使用に苦しんでいます。C++ 言語では、ポインター自体と、これらのポインターが指すオブジェクトを明確に区別しています。ポインター型は多態的ではありません。ポインター自体にはポリモーフィックはありません。実際にポリモーフィックになる可能性があるのは、ポインターが指す型です。ポインターがポリモーフィック型を指す場合、[非公式に]ポリモーフィック ポインターと呼ぶことがよくあります(「ポリモーフィック型を指すポインター」の省略形として)。しかし、のようなことになるとtypeid、彼らは物事を非常に形式的に見ます. typeidポインター型は決してポリモーフィックではありません。

また、コンパイラは、ポインターが多態的であるかどうかを実行時に判断しません。この単純な区別は、コンパイル時に常にすぐにわかります。繰り返しになりますが、ポインターが多相型へのポインターとして宣言されている場合、そのポインターは多相と呼ばれます。ポリモーフィック型は、(直接的または間接的に) 仮想関数を含むクラス型です。明らかに、ポリモーフィックであるというプロパティは、純粋にコンパイル時の型のプロパティです。

このような場合に実行時に決定される唯一のことは、指定された時点で指定されたオブジェクトがどの特定のタイプを持っているかです。

于 2013-06-09T15:39:47.353 に答える