[c++] privateとprotectedの違い

アクセス指定子には、public, private, protectedがある。

public: すべての範囲からアクセスが可能
private: 同一クラスまたは同一インスタンス内でのみアクセス可能
protected: 同一クラスまたは同一インスタンス内もしくは、サブクラスおよびそのインスタンス内でのみアクセス可能

e.g.

//
protected:
    void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t) override
        EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
    void TransactionremovedFromMempool(const CTransactionRef& tx, MempoolRemovalReason, uint64_t)
        EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);
    void MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>& txs_removed_for_block, unsigned int nBlockHeight) override
        EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator);

[c++] virtualの使い方

C++はクラスを継承する際に、デストラクタにvirtual修飾子を付けることが推奨されている。

e.g.
virtual ~Ambulance();

virtual修飾子は仮想関数として機能する。virtualが付いたメンバ関数の場合、子クラスでオーバーライドされた同名のメンバ関数が実行される。

#ifndef _BIRD_H_
#define _BIRD_H_

#include <iostream>
#include <string>

using namespace std;

class Bird {
public:
	virtual void sing();

	void fly();
};

#endif
#include "bird.h"

void Bird::sing(){
	cout << "鳥が鳴く" << endl;
}

void Bird::fly(){
	cout << "鳥が飛ぶ" << endl;
}

継承した仮想関数

#ifndef _CROW_H_
#define _CROW_H_

#include "bird.h"

class Crow : public Bird {
public:
	void sing();

	void fly();
};

#endif
#include "crow.h"

void Crow::sing(){
	cout << "カーカー" << endl;
}

void Bird::fly(){
	cout << "カラスが飛ぶ" << endl;
}

親クラスで定義するんだね。
親クラスで使わない場合は、=0として、純粋仮想関数とすることもできる。

#ifndef _BIRD_H_
#define _BIRD_H_

#include <iostream>
#include <string>

using namespace std;

class Bird {
public:
	virtual void sing() = 0;

	void fly();
};

#endif

仮想関数、純粋仮想関数など馴染みの無い名称だととっつきにくいが、内容は理解しました。