[CPP Moudle 04] Subtype polymorphism, abstract classes, interfaces
7716 ワード
1.多形性と仮想関数
1.1. たけいせい
派生クラスでは、継承されたベースクラスのメンバー関数を異なる動作に上書きするのが多形性、すなわち多形性とは、複数の異なるオブジェクトが異なる方法で同じ機能を処理できるテクニックを指す.
1.2. 仮想関数
CPPでは、仮想関数は、派生クラスで再定義されることが望ましいメンバー関数を意味する.仮想関数を使用しない場合は、ベースクラスのメンバー関数が何気なく呼び出されます.class Victim
{
...
virtual void getPolymorphed(void) const;
};
class Peon : public Victim
{
...
void getPolymorphed() const; //
};
2.抽象クラスの必要性:純仮想関数
2.1. 仮想関数の問題点
仮想関数に脆弱性がある場合、親クラスで実装される仮想関数には、子クラスが実装する必要がある強制性はありません.したがって,純粋な仮想関数が現れる.
2.2. じゅんかそうかんすう
純粋な仮想関数とは、関数本体を定義しない関数です.virtual type func_name() = 0;
純粋な仮想関数の宣言は上記の形式のメンバー関数となり、このクラスでは実現できません.継承されたサブクラスで再定義する必要があります.// .hpp
class AWeapon // 추상 클래스
{
...
virtual void attack(void) const = 0; // 순수가상함수, 소스파일에서 정의 X
};
class PlasmaRifle : public AWeapon
{
...
void attack() const;
};
class PowerFist : public AWeapon
{
...
void attack() const;
};
// .cpp
void PlasmaRifle::attack(void) const
{
std::cout << "* piouuu piouuu piouuu *" << std::endl;
}
void PowerFist::attack(void) const
{
std::cout << "* pschhh... SBAM! *" << std::endl;
}
2.3. 抽象クラス
純粋な仮想関数を1つ以上のメンバー関数として使用するクラスを抽象クラスと呼びます.抽象クラスはオブジェクト向けプログラミングにおいて重要な特徴,すなわち多形性を持つ関数集合を定義できることに意義がある.
抽象クラスには、アクションが定義されていない純粋な仮想関数が含まれているため、インスタンスを作成できません.継承により、派生クラスを作成し、派生クラスで純粋な仮想関数を再定義し、派生クラスのインスタンスを作成できます.
抽象クラスの特徴は、上書き、すなわち関数を再定義する必要があることです.純粋な仮想関数を再定義しないと、コードでエラーと判断されるため、エラーを防止できます.
3.インタフェースクラス
3.1. インタフェース
インタフェースは、仮想消滅者と純粋な仮想関数のみを宣言するクラスです.プログラム構造を理解するときに最初にHADERファイルを見るように,インタフェースを介してクラス全体の構造を容易に理解できる.class IClass
{
public:
virtual ~IClass();
virtual void myFunc1() = 0;
...
};
class Victim
{
...
virtual void getPolymorphed(void) const;
};
class Peon : public Victim
{
...
void getPolymorphed() const; //
};
2.1. 仮想関数の問題点
仮想関数に脆弱性がある場合、親クラスで実装される仮想関数には、子クラスが実装する必要がある強制性はありません.したがって,純粋な仮想関数が現れる.
2.2. じゅんかそうかんすう
純粋な仮想関数とは、関数本体を定義しない関数です.
virtual type func_name() = 0;
純粋な仮想関数の宣言は上記の形式のメンバー関数となり、このクラスでは実現できません.継承されたサブクラスで再定義する必要があります.// .hpp
class AWeapon // 추상 클래스
{
...
virtual void attack(void) const = 0; // 순수가상함수, 소스파일에서 정의 X
};
class PlasmaRifle : public AWeapon
{
...
void attack() const;
};
class PowerFist : public AWeapon
{
...
void attack() const;
};
// .cpp
void PlasmaRifle::attack(void) const
{
std::cout << "* piouuu piouuu piouuu *" << std::endl;
}
void PowerFist::attack(void) const
{
std::cout << "* pschhh... SBAM! *" << std::endl;
}
2.3. 抽象クラス
純粋な仮想関数を1つ以上のメンバー関数として使用するクラスを抽象クラスと呼びます.抽象クラスはオブジェクト向けプログラミングにおいて重要な特徴,すなわち多形性を持つ関数集合を定義できることに意義がある.
抽象クラスには、アクションが定義されていない純粋な仮想関数が含まれているため、インスタンスを作成できません.継承により、派生クラスを作成し、派生クラスで純粋な仮想関数を再定義し、派生クラスのインスタンスを作成できます.
抽象クラスの特徴は、上書き、すなわち関数を再定義する必要があることです.純粋な仮想関数を再定義しないと、コードでエラーと判断されるため、エラーを防止できます.
3.インタフェースクラス
3.1. インタフェース
インタフェースは、仮想消滅者と純粋な仮想関数のみを宣言するクラスです.プログラム構造を理解するときに最初にHADERファイルを見るように,インタフェースを介してクラス全体の構造を容易に理解できる.class IClass
{
public:
virtual ~IClass();
virtual void myFunc1() = 0;
...
};
class IClass
{
public:
virtual ~IClass();
virtual void myFunc1() = 0;
...
};
純粋な仮想関数のみで構成されるため、インスタンスを自分で作成することはできません.
インタフェースを継承するサブアイテムで実装する必要があります.
理想的な抽象クラス=インタフェースと考えられる.
不要なデータの継承を回避し、特定のクラスから削除されたエラーを複数の形式化関数を過負荷することを回避できます.
インタフェースクラスを作成し、多重継承を利用して、優れた設計モードを持つプログラムを設計することができます.
Reference
この問題について([CPP Moudle 04] Subtype polymorphism, abstract classes, interfaces), 我々は、より多くの情報をここで見つけました https://velog.io/@24siefil/CPP-Moudle-04テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol