MFC の奇妙なクラス階層のおかげで気づいたこと

スーパークラスの protected なメンバは、this の方は触れるが、
そうじゃないインスタンスの場合は触れないっぽい。

class cBase
{
	protected: void DoBaseAction() {}
};

class cDerived : public cBase
{
	public: void DoDerivedAction()
	{
		this->DoBaseAction(); // OK
		cBase test;
		test.DoBaseAction();  // NG
	}
};

int main(int argc, char** argv)
{
	cDerived obj;
	obj.DoDerivedAction();
	
	return 0;
}

MFC の奇妙な継承関係と意味不明なアクセス設定(なんでメンバ変数を public でダダ漏れさせてるクラスのメソッドが protected やねんwみたいな)のおかげで C++ の文法的な部分のルールをまだ知らない部分があったと気づきました。
VB6 のクラスモジュールとかが確か同じクラスのインスタンスでもアクセス制限が適用されるんだったよなぁ、と。


今まで気づかなかった要因を考えてみたんだけど…


自分で書いたクラスの場合… 値型のクラスは継承しない。
参照型のクラスは Java の interface 風のクラスを通して扱ってる。
拡張を目的とした継承をしない。させない。
みたいな感じにしてるからそういう書き方をしなくちゃいけないことが無かったのではないかと思う。


このルールって C# とか Java とか D言語とかもそうなのかなぁ。