C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の親クラス(基底クラス)から継承されるものとは?

オブジェクト指向プログラミングでは、親クラスの特性を子クラスに引き継ぐ「継承」という仕組みを利用できます。親クラスは基底クラス(base class)、子クラスは派生クラス(derived class)と呼ばれます。派生クラスは、基底クラスが持つデータメンバ(メンバ変数)やメンバ関数を継承することができます。

アクセス指定子による継承の違い

継承されるメンバへのアクセス可否は、アクセス指定子によって決まります。

  • public:派生クラス、同じクラス内、クラス外のどこからでもアクセス可能です。
  • protected:派生クラスと同じクラス内からのみアクセス可能です。クラス外からはアクセスできません。
  • private:同じクラス内からのみアクセス可能で、派生クラスからもアクセスできません。

つまり、privateメンバは継承されていても派生クラスから直接扱うことはできず、protectedメンバは派生クラスから利用できるという点が大きな違いです。

C++における継承のサンプルコード

以下は、C++言語における継承の具体例です。

#include <bits/stdc++.h>
using namespace std;
class Base {
    public: int a;
    protected: int b;
    private: int c;
};
class Derived : public Base {
    public: int x;
};
int main() {
    Derived d;
    d.a = 10;
    d.x = 20;
    cout << "Derived class data member value : " << d.x << endl;
    cout << "Base class data member value : " << d.a << endl;
    return 0;
}

実行結果

Derived class data member value : 20
Base class data member value : 10

コードの解説

上記のプログラムでは、派生クラスDerivedが基底クラスBaseを継承しています。派生クラスのオブジェクトdを生成し、それを使って基底クラスのデータメンバaと派生クラスのデータメンバxにアクセスしています。

一方、基底クラスの変数bはprotected、変数cはprivateとして宣言されているため、これらにアクセスしようとするとコンパイルエラーが発生します。このように、アクセス指定子を適切に使い分けることで、カプセル化を保ちながら安全なクラス設計を行うことができます。

  1. C++で有向非巡回グラフの始点から終点への全経路を求める方法

    ノード数 N の有向非巡回グラフ(DAG)が与えられているとします。ここでの課題は、ノード 0 からノード N-1 へ至るすべての経路を見つけ出し、任意の順序で返すことです。グラフは次のように表現されます。ノードは 0, 1, ..., graph.length - 1 であり、graph[i] は「辺 (i, j) が存在するノード j」のリストを意味します。たとえば、入力が [[1,2], [3], [3], []] の場合、出力は [[0,1,3], [0,2,3]] となります。解法のアプローチこの問題は深さ優先探索(DFS)とバックトラッキングを組み合わせることで解けます。具体的には

  2. C++で二分木の特定ノードから距離Kにあるすべてのノードを出力する方法

    問題の概要本記事では、二分木・ターゲットノード・整数Kが与えられたとき、ターゲットノードから距離Kにあるすべてのノードを出力するアルゴリズムをC++で実装して解説します。二分木(Binary Tree)とは、各ノードが最大2つの子ノード(0個・1個・2個)を持つことができる特殊な木構造です。問題例まず、具体例を使って問題を理解しましょう。下図のような二分木を考えます。K = 2ターゲットノード: 9出力:5 1 3説明:ここでいう「距離」は、ターゲットノードより上の階層・下の階層・同じ階層のいずれのノードに対しても定義されます。そのため、方向を問わず距離Kにあるノードをすべて出力する必要があり