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として宣言されているため、これらにアクセスしようとするとコンパイルエラーが発生します。このように、アクセス指定子を適切に使い分けることで、カプセル化を保ちながら安全なクラス設計を行うことができます。
-
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)とバックトラッキングを組み合わせることで解けます。具体的には
-
C++で二分木の特定ノードから距離Kにあるすべてのノードを出力する方法
問題の概要本記事では、二分木・ターゲットノード・整数Kが与えられたとき、ターゲットノードから距離Kにあるすべてのノードを出力するアルゴリズムをC++で実装して解説します。二分木(Binary Tree)とは、各ノードが最大2つの子ノード(0個・1個・2個)を持つことができる特殊な木構造です。問題例まず、具体例を使って問題を理解しましょう。下図のような二分木を考えます。K = 2ターゲットノード: 9出力:5 1 3説明:ここでいう「距離」は、ターゲットノードより上の階層・下の階層・同じ階層のいずれのノードに対しても定義されます。そのため、方向を問わず距離Kにあるノードをすべて出力する必要があり