C++ではクラスを継承できません
1219 ワード
Javaの基礎を少し学んだことがある人はすべて知っていて、javaの中で1つのクラスを継承することができなくて、直接クラスの前でfinalキーワードで修飾すればいいです.しかしC++ではどのように実現しますか?一般的には2つの考え方がある.1、コンストラクション関数をプライベートとして宣言し、静的関数を定義してオブジェクトを作成するという多くの人が考えています.しかし、柔軟性が悪く、オブジェクトを構築するたびにこの静的関数を呼び出さなければなりません.2、友元が受け継がれない特性を利用する.1)データメンバーやメンバー関数のないベースクラスを定義し,そのコンストラクション関数をプライベートとして明示する2)継承したくないクラスを上のベースクラスに継承するとともに,その友元として明示することができ,ここでは継承できないクラスを構築するたびにベースクラスを変更する必要がないため,テンプレートを用いてベースクラスの友元クラスを汎化する.コードは次のとおりです.
「`/*@author rly@date 2018.2.3クラスが継承されないことを検証する方法の例*/
template class CfinalClass { public: friend T; private: CfinalClass() {
};
class CParent : public CfinalClass { public: CParent() {
}; これにより、クラスCchildがCParentクラスを継承すると、メタプロパティが継承されないため、CchildクラスはCfinalClassのコンストラクション関数にアクセスできず、オブジェクトを構築できません.しかし、結果は確かに構築できるのはなぜでしょうか.CchildクラスがCParentクラスを継承しているため、CParentクラスが通常の公有であれば、保護またはプライベート継承はCParentクラスのコンストラクション関数を先に呼び出し、CParentクラスはCfinalClassクラスのコンストラクション関数を先に呼び出してから自分のコンストラクション関数を呼び出すことが明らかに可能でしょう.
Cchildクラスを継承されたレベルで、親クラス呼び出しではなく構造関数を直接上から下に呼び出すことができればよい.ここで虚継承の特性を借りてCParentクラスの継承方式をvirtual継承に変更すればよい.
コンストラクション関数の詳細については、『深度探索C++オブジェクトモデル』を参照してください.
「`/*@author rly@date 2018.2.3クラスが継承されないことを検証する方法の例*/
template class CfinalClass { public: friend T; private: CfinalClass() {
}
~CfinalClass()
{
}
};
class CParent : public CfinalClass { public: CParent() {
}
~CParent()
{
}
}; これにより、クラスCchildがCParentクラスを継承すると、メタプロパティが継承されないため、CchildクラスはCfinalClassのコンストラクション関数にアクセスできず、オブジェクトを構築できません.しかし、結果は確かに構築できるのはなぜでしょうか.CchildクラスがCParentクラスを継承しているため、CParentクラスが通常の公有であれば、保護またはプライベート継承はCParentクラスのコンストラクション関数を先に呼び出し、CParentクラスはCfinalClassクラスのコンストラクション関数を先に呼び出してから自分のコンストラクション関数を呼び出すことが明らかに可能でしょう.
Cchildクラスを継承されたレベルで、親クラス呼び出しではなく構造関数を直接上から下に呼び出すことができればよい.ここで虚継承の特性を借りてCParentクラスの継承方式をvirtual継承に変更すればよい.
コンストラクション関数の詳細については、『深度探索C++オブジェクトモデル』を参照してください.