1. ホーム
  2. c++

[解決済み】仮想関数と純粋仮想関数の違い【重複あり

2022-04-05 23:16:13

質問

純粋仮想関数と仮想関数の違いは何ですか?

純粋仮想関数とは、本体を持たない仮想関数であることは知っています。

virtual void virtualfunctioname() = 0

解決方法は?

仮想関数によって、そのクラスが ポリモーフィックベースクラス . 派生クラスは仮想関数をオーバーライドすることができます。ベースクラスのポインタ/参照を通じて呼び出された仮想関数は、実行時に解決されます。つまり 動的型 の代わりに、そのオブジェクトの 静的型 :

 Derived d;
 Base& rb = d;
 // if Base::f() is virtual and Derived overrides it, Derived::f() will be called
 rb.f();  

純粋仮想関数とは、宣言の末尾が =0 :

class Base {
  // ...
  virtual void f() = 0;
  // ...

純粋仮想関数は、それが定義されているクラスを暗黙のうちに 抽象的 (クラスの抽象化を明示的に宣言するキーワードがあるJavaとは異なります)。抽象クラスはインスタンス化できません。派生クラスは、継承されたすべての純粋仮想関数をオーバーライド/実装する必要があります。そうでない場合は、抽象クラスになります。

C++の興味深い「機能」は、クラスが実装を持つ純粋仮想関数を定義できることです。 ( それが何の役に立つかは議論の余地がある .)


C++11 では、このように deletedefault というキーワードがあり、純粋仮想関数の構文に似ています。

my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;

参照 この質問 これ を使用することで、より多くの情報を得ることができます。 deletedefault .