C++ 継承におけるメンバーの権限、コンストラクター、およびデストラクター

  1. メンバーの権限を継承する

    親クラスのメンバ変数とメンバ関数の権限の種類には、public、protected、private があり、
    継承にも public、protected、private の 3 種類があります。

    親クラスの権限\継承メソッド 公共 保護された プライベート
    公共 公共 保護された プライベート
    保護された 保護された 保護された プライベート
    プライベート アクセスできない アクセスできない アクセスできない

    親クラスのプライベート メンバーは確かにサブクラスから継承されていますが、サブクラスのメンバーにはアクセスできないことがわかります。継承後の親クラスのパブリック メンバーと保護されたメンバーのアクセス許可は、アクセス許可の厳密なバージョンです。および親クラスの継承メソッド。したがって、親クラスのプライベートメンバやサブクラスのメンバ関数にはアクセスできません。継承した場合でも、自身で新規追加した場合でも、親クラスのプライベートメンバにはアクセスできません。非プライベートメンバ関数を呼び出す
    ことによってのみアクセスできます。メンバ関数内の親クラスの(プライベートメンバにはアクセスできないため) 親クラスのプライベートメンバへの間接アクセス

    class A
    {
          
          
    public:
        A(int a_, int b_):a(a_),b(b_){
          
          }
        int geta()
        {
          
          
            return a;
        }
    
    private:
        int a;
        int b;
    };
    
    class B:protected A
    {
          
          
    public:
        B(int a_,int b_,int c_):A(a_,b_), c(c_){
          
          }
        int getaa()
        {
          
          
            return geta();
        }
    
    private:
        int c;
    };
    
    int main()
    {
          
          
        B MY{
          
          1,2,3};
        cout<<MY.getaa()<<endl;  //可以,用父类的成员函数间接访问
        cout<<MY.geta()<<endl;  //报错,无法访问
        return 0;
    }
    
  2. コンストラクター
    クラスにはコンストラクターとデストラクターが必要ですが、それを作成しない場合は、コンパイラーがデフォルトのコンストラクターとデストラクターを自動的に生成します。コンストラクターを作成する限り、コンパイラーはパラメーターのないデフォルトのコンストラクターを生成しません。そのため、デフォルトのコンストラクターも作成することをお勧めします (複数のコンストラクターはオーバーロードされます)。

    サブクラス オブジェクトをインスタンス化する場合、サブクラスのコンストラクターは親クラスのコンストラクターも呼び出す必要があります。コンストラクターはサブクラスに継承されないため、初期化リスト内でのみ呼び出すことができます。したがって、初期化リストで呼び出す親クラスのコンストラクターを指定するのが最善です。指定されていない場合でも、親クラスのデフォルトのコンストラクターが呼び出されます。このとき、親クラスにコンストラクターがあることを確認する必要があります。そうでない場合は、エラーが報告されます。
    コンストラクターが呼び出される順序は、最初に親クラスのコンストラクター、次にサブクラスのコンストラクターです。

  3. デストラクターはいつ
    デストラクターを作成する必要がありますか? コンストラクターで動的メモリを新規作成するときは、デストラクターの delete を記述してメモリを解放する必要があります。そうしないと、メモリ リークが発生します。
    継承におけるデストラクターの呼び出し順序はコンストラクターとは逆で、最初にサブクラスのデストラクターを呼び出し、次に親クラスのデストラクターを呼び出します。このとき、各クラスにはデストラクターが 1 つだけあるため、親クラスのどのデストラクターを指定する必要はありません。

おすすめ

転載: blog.csdn.net/qq_41253960/article/details/124347463