0

C++ で次の正確な用語を取得したいと思います。

次のおもちゃの例を考えてみてください。

class A{
public:
   virtual void f(){ std::cout << "This is A" << std::endl; };
};

class B: public A{
public:
   virtual void f(){ std::cout << "This is B" << std::endl; };
};

int main(int argc, char** argv){
   A* ptr = new A(); //Base class pointer pointing to base class object
   ptr->f(); //Base class method is called
   delete ptr;
   ptr = new B(); ////Base class pointer pointing to derived class object
   ptr->f(); //Derived class method is called
   delete ptr;
   return 0;
}

出力は次のとおりです。これは A です これは B です

これに関する正確な C++ 用語を知りたいです。それはポリモーフィズムかメソッドのオーバーライドか何かですか?

主なことは、基本クラスのポインターを使用していることです。ポインターが基本クラス オブジェクトを指す場合、基本クラス メソッドが呼び出されます。派生クラス オブジェクトを指す場合、両方のクラスでメソッドが virtual として宣言されている場合、派生クラス メソッドが呼び出されます。

ありがとう

4

4 に答える 4

4

それは、ポリモーフィズムメソッドオーバーライドの両方です:

ポリモーフィズム:さまざまな基本フォーム (データ型) に対して同じインターフェイスを提供する (プログラミングにおける) 機能。

Shape クラスとそれから継承できるすべてのクラス (正方形、円など) の例。

メソッドのオーバーライド: サブクラスまたは子クラスが、スーパークラスまたは親クラスのいずれかによって既に提供されているメソッドの特定の実装を提供できるようにする言語機能です。

あなたの場合、B特定の形式A(ポリモーフィズム) です。そして、基本クラスに既に実装されてBいるメソッドの特定の実装を提供します( method-overridding )。f()


質問についてではありませんが、コードがリークしています:

int main(int argc, char** argv)
{
   A* ptr = new A(); //Base class pointer pointing to base class object
   ptr->f(); //Base class method is called
   delete ptr;
// ^^^^^^^^^^^
   ptr = new B(); ////Base class pointer pointing to derived class object
   ptr->f(); //Derived class method is called
   delete ptr;
// ^^^^^^^^^^^
   return 1;
   //     ^ Indicate that your program failed ?
}

動的に割り当てられたメモリの割り当てを解除することを忘れないでください。

また、可能な場合はまったく使用new/deleteしないでください。ここに説明があります。

は、プログラムも失敗したreturn 1;ことを示しています。

于 2013-09-02T13:52:23.727 に答える
1

これは、ポリモーフィズムとオーバーライドの両方です。オーバーライドは、ポリモーフィズムの特定の用途です。

于 2013-09-02T13:32:55.637 に答える
0

それはポリモーフィズムであり、メモリリークです。

delete質問するには多すぎたでしょうか?

int main(int argc, char** argv){
   A* ptr = new A(); //Base class pointer pointing to base class object
   ptr->f(); //Base class method is called
   delete ptr;  // Free up allocated memory.
   ptr = new B(); ////Base class pointer pointing to derived class object
   ptr->f(); //Derived class method is called
于 2013-09-02T13:36:14.377 に答える
0

そう、ポリモーフィズムです。ただし、C++11 機能を使用してコードを少し変更するだけで同じことができます (コンパイラで利用できる場合)。これにより、メモリ リークなどのエラーが発生しにくくなります。

class A {
public:
   virtual void f() { std::cout << "This is A" << std::endl; };
};

class B: public A {
public:
   virtual void f() override { std::cout << "This is B" << std::endl; };
};

int main()
{
   auto ptr = std::unique_ptr<A>(new A());
   ptr->f();
   ptr = std::unique_ptr<B>(new B());
   ptr->f();

   return 0;
}
于 2013-09-02T14:01:15.957 に答える