13

私が思うに、動的タイプとは、を使用して動的に割り当てられたオブジェクトを意味しますnewp次の場合、オブジェクトの動的タイプまたは静的タイプを指していると言いますか?標準では、動的型が動的オブジェクトであるとは言いません。

1.3.3-左辺値式で示される左辺値が参照する最も派生したオブジェクトのタイプ(1.8)。[例:静的型が「クラスBへのポインタ」であるポインタ(8.3.1)pが、B(10節)から派生したクラスDのオブジェクトを指している場合、式*pの動的型は「D」です。 。」参照(8.3.2)も同様に扱われます。]

また、次の引用はどういう意味ですか

右辺値式の動的型は静的型です

class Base {
    virtual void foo(){}
};

class Derived : public Base {
    void foo(){}
};

int main()
{
    Derived d;
    Base *p = &d;
}
4

4 に答える 4

26

私が思うに、動的タイプとは、newを使用して動的に割り当てられたオブジェクトを意味します。

いいえ。

動的型は、実際の型の基本型を指す参照(ポインターを含む)を介してアクセスされる可能性のあるオブジェクトの実際の型です。

つまり、次の場合:

class A {

};

class B : public A { };


B l;
A& k = l;

ここで、kはタイプAのオブジェクトへの参照ですが、参照されるオブジェクトの実際のタイプである動的タイプはBです。

ここで「動的」とは、「実行時にのみ知られる」という意味です。

于 2011-10-04T14:45:28.240 に答える
6

静的型は変数の型であり、コンパイル時に既知の唯一の型です(したがって、静的と見なされます-変更できません)。動的タイプは、実行時に実際にポイントされているオブジェクトのタイプです。ここでの動的とは、実行時にのみ認識されることを意味します。つまり、変更される可能性があります(つまり、1つの変数がさまざまなタイプのさまざまなオブジェクトを指すことができます)。

newあなた自身の例が示すように、このコンテンツでの使用は関係ありません。メインでは、静的および動的タイプはdですDerived。これは、ポインターまたは参照ではないためです。pただし、静的タイプはBase。ですが、コードでは動的タイプは。になりますDerived

于 2011-10-04T14:44:53.873 に答える
5

たとえば、C ++やJavaなどの静的に型付けされた言語では、staticコンパイル時に既知の情報を参照し、dynamic実行時に既知の情報を参照する場合があります。

例えば:

struct Base { virtual std::string name() const { return "Base"; } };

struct Derived: Base { std::string name() const { return "Derived"; } };

void print(Base const& b) { std::cout << b.name() << "\n"; }

printメソッドでは、のタイプstaticbですBase const&。したがって、コンパイラは、呼び出されたすべてのメソッドがBaseオブジェクトのコンテキストに存在することを確認します。

ただし、実行が行われると、メソッドは仮想であるため、オブジェクトnameのタイプに関して、の呼び出しが実行されます。dynamic

  • これはBase
  • これはDerived
  • Baseこれは、まだわかっていない別の派生クラスである可能性があります

したがって、次の例では次のようになります。

int main(int argc, char* argv[]) {
  if (argc == 1) {
    Base base;
    print();
  } else {
    Derived derived;
    print(derived);
  }
};
  • staticandのdynamicタイプはbaseisBasederivedisDerivedです。
  • printメソッドでは、のタイプstaticbBase常に)です
  • 引数の数に応じて、dynamicofbBaseまたはDerived

ポリモーフィズムが必然的に動的メモリ割り当てに基づいていると考えるのは現在の間違いですが、2つの概念は直交ではありませんが、条件によっては互いに使用せずに使用できます。

于 2011-10-04T15:13:06.637 に答える
-2

動的メモリ割り当ては常に実行時に行われます。「new」キーワードを使用して実現できます。しかし、ここで問題に言及されているように、もう1つのケースがあります。基本クラス関数を「仮想」にしたため、コンパイラは、それが属するポインタのタイプではなく、コンテンツによって「p」を処理するように指示されます。これは動的メモリ割り当ての1つです。コンパイラは、実行時に格納するクラスオブジェクトのアドレスを認識せず、ポインタのタイプ(つまり、基本クラスポインタまたは派生クラスポインタ)のみを認識します。

于 2011-10-04T15:31:41.200 に答える