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