Translations of this page?:

virtual

文法:

    virtual 返り値の型 名前( 引数リスト );
    virtual 返り値の型 名前( 引数リスト ) = 0;

virtualキーワードは仮想関数を作成するために使用します。仮想関数は派生クラスでオーバーライドすることが可能です。

  • 仮想関数はサブクラスでオーバーライドすることが可能であるということを表します。オーバーライドすると、新しく定義された関数が利用されます。
  • もしもベースクラスのポインタが、派生クラスのオブジェクトを指していたとすると、その派生クラスがオーバーライドされた関数を定義していた場合には、その新しい関数が使用されます。
  • ベースオブジェクトはさまざまな異なる仮想関数を実行するために、いろいろな派生オブジェクトを指すことができます。

もしも関数が純粋仮想関数(後ろに = 0が付きます)として定義されている場合には、派生クラスで上書きしなければなりません。

例えば、以下のコードは子クラスがどのようにして親の仮想メソッドをオーバーライドするのか、というのを表現しています。また、仮想関数ではないメソッドがオーバーライドできないというのも示しています:

  class Base {
  public:
   void nonVirtualFunc() {
     cout << "親: 非仮想関数" << endl;
   }
   virtual void virtualFunc() {
     cout << "親: 仮想関数" << endl;
   }
  };
 
  class Child : public Base {
  public:
   void nonVirtualFunc() {
     cout << "子: 非仮想関数" << endl;
   }
   void virtualFunc() {
     cout << "子: 仮想関数" << endl;
   }
  };
 
  int main() {
   Base* basePointer = new Child();
   basePointer->nonVirtualFunc();
   basePointer->virtualFunc();
   return 0;
  }

このコードを実行すると、以下の結果が表示されます:

  親: 非仮想関数
  子: 仮想関数

関連トピック: class

 
• • • SitemapRecent changesRSScc