c++虚関数解析

1765 ワード

1.虚関数の役割---ベースクラスポインタが派生クラスを指す場合、このベースクラスポインタを使用して派生クラスの関数を呼び出す
マルチステートにおける派生クラスとベースクラスの特殊な関係の1つは、ベースクラスポインタが明示的なタイプ変換を行わずに派生クラスのオブジェクトを指すことができ、ベースクラスリファレンスは明示的なタイプ変換を行わずに派生クラスオブジェクトを参照することができる.
ベースクラスポインタが呼び出す関数を区別するために、ベースクラスの関数なのか、派生クラスの関数なのかを区別するために、虚関数を引き出した.
では、虚関数とは何かを見てみましょう.まず、マイクロソフトの説明を見てみましょう.虚関数とは、クラス内で再ロードしたいメンバー関数を指し、ベースクラスポインタまたは参照で継承クラスオブジェクトを指す場合、実際に呼び出されるのは継承クラスのバージョンです.
このように、ベースクラスポインタを使用して派生クラスのオブジェクトを指す場合、ベースクラスポインタを使用して関連する関数を呼び出すと、派生クラス関数の呼び出しが実現される.呼び出した関連関数がオブジェクト定義時の関連クラスの関数であることを保証します.
2.虚関数呼び出しの実現
虚関数のあるクラスには、クラスの先頭に置かれ、このクラスの虚関数テーブル(virutal table)を指す虚関数テーブルポインタvfptr(virtual table pointer、虚関数テーブルポインタ)があるに違いない.VTABLEはクラスのすべてのオブジェクトが共有し、クラスを定義するときに初期化される.VTRは各クラスオブジェクトが独立しており、そのクラスオブジェクトが構築されたときに初期化される.オブジェクトが虚関数を呼び出すと、実際の呼び出された関数は、オブジェクトのvptrが指すvtblを見つけ、vtblで適切な関数ポインタを探すステップによって決定されます.
3.純虚関数
純虚関数は、クラスの宣言で=0と宣言された関数です(具体的には、次の例のコードを参照).純虚関数には次のような特徴があります.
  • クラスが純粋な虚関数を定義している場合、このクラスは虚ベースクラスと呼ばれます.
  • クラスが純粋な虚関数を定義している場合、クラスでは関数を実装することはできませんが、クラスを継承するクラスでのみ実装できます.
  • クラスがダミーベースクラスである場合、このクラスはオブジェクトをインスタンス化できません.
  • クラスが虚ベースクラスである場合、継承されたクラスはすべての純虚関数を実現していない場合、この継承されたクラスも虚ベースクラスである.

  • 純粋な虚関数は、ベースクラスポインタが指すサブクラスオブジェクトを正しい関数に呼び出すこともできます.
    以下に、純虚関数の例を示します.
    #include <iostream>
    using namespace std;
    class A {
    public:
        virtual void foo() = 0; //          ,A       ,       。
    };
    class B : public A {
    public:
        virtual void foo() {
            cout << 'B' << endl;
        }
    };
    int main() {
        A *p = new B();
        p->foo();
        return 0;
    }

    虚関数と純虚関数の違いについて述べた以上、ここでは虚関数のFAQについても述べる.
  • クラスには虚関数があり、オブジェクトをインスタンス化できません.
  • 親クラスに虚関数があり、子クラスが親クラスのこの関数を書き換えていない場合、呼び出すと親クラスのこの関数も呼び出されます.