仮想関数の知識ポイント

1.仮想関数は仮想関数と呼ばれます。

2.仮想関数が基本クラスで定義されている場合サブクラス内の同じ名前および同じパラメーター型(戻り値の型は異なる場合があります)のパラメーターはそれオーバーライドできます(サブクラス内の対応する関数はできません)この時点で仮想を追加しますが、これは仮想関数でもあります)、オーバーライドを追加できます)、コンパイラは正しい関数が実行されることを確認します。

3.仮想関数を含む各クラスには仮想関数テーブルがあり、コンパイラーは仮想関数テーブルに従って呼び出される仮想関数の正しいバージョンを決定します(基本クラスの関数サブクラスが呼び出されます)。

4.サブクラスの関数は、基本クラスの関数タイプをカバーします。

  • 仮想:上書きされる可能性があります
  • = 0:関数は仮想である必要があり、オーバーライドする必要があります(基本クラスの場合)
  • オーバーライド:関数は、基本クラス(サブクラスの場合)の対応する関数をオーバーライドする必要があります
  • 最終:オーバーライドできません

5.クラス名にfinalを追加して、クラス内のすべての仮想メンバー関数をfinalとして宣言します。これにより、他のクラスがこのクラスを継承することを禁止できます。

6.上記の2番目のポイントは、サブクラスが基本クラスの仮想関数をオーバーライドする場合、戻り値の型が異なる可能性があることを示しています。要件は次のとおりです。

  • 戻り値の型は、サブクラス/基本クラスのポインタ/参照です。
  • スマートポインタになることはできません

満足させる:

class A
{
public:
    int a;    
    virtual A* cloneMySelf()
    {
        A * p = new A;
        p->a = this->a;
        return p;
    }
};

class B : public A
{
public:
    int b;
    B* cloneMySelf()
    {
        B * p = new B;
        p->b = this->b;
        return p;
    }
};

満足していません:

class A
{
public:
    int a;    
    virtual std::shared_ptr<A> cloneMySelf()
    {
        std::shared_ptr<A> p(new A);
        p->a = this->a;
        return p;
    }
};

class B : public A
{
public:
    int b;
    virtual std::shared_ptr<B> cloneMySelf()
    {
        std::shared_ptr<B> p(new B);
        p->b = this->b;
        return p;
    }
};

7.仮想関数= 0;関数の形式は純粋仮想関数です。1つ以上の純粋仮想関数を含むクラスは抽象クラスと呼ばれます。オブジェクトの作成には使用できず、実装するサブクラスのインターフェイスの定義に使用されます。 。サブクラスがまだ純粋仮想関数を実装していない場合でも、サブクラスは抽象クラスです。

おすすめ

転載: blog.csdn.net/kenfan1647/article/details/114463456