effective c++ & c++

c++ 복습 - 접근 지정자를 동반한 상속의 특성.

공대녀J 2022. 10. 13. 10:35
#include <iostream>
using namespace std;

class SoBase
{
private:
	int baseNum;
	int num1 = 1;
protected:
	int num2 = 2;
public:
	int num3 = 3;

	SoBase() : baseNum(20)
	{
		cout << "SoBase()" << '\n';
	}
	
	SoBase(int n) : baseNum(n)
	{
		cout << "SoBase(int n)" << '\n';
	}

	~SoBase()
	{
		cout << "~SoBase() : " << baseNum << '\n';
	}

	void ShowBaseData() const
	{
		cout << baseNum << '\n';
		cout << num1 << ' ' << num2 << ' ' << num3 << '\n';
	}
};

class SoDerived : protected SoBase
{
private:
	int derivNum;
public:
	SoDerived() :derivNum(30)
	{
		cout << "SoDervied()" << '\n';
	}
	SoDerived(int n) :derivNum(n)
	{
		cout << "SoDervied(int n)" << '\n';
	}
	SoDerived(int n1,int n2) :derivNum(n2),SoBase(n1)
	{
		cout << "SoDervied(int n1,int n2)" << '\n';
	}

	~SoDerived()
	{
		cout << "~SoDerived() : " << derivNum << '\n';
	}

	void ShowDerivData() const
	{
		ShowBaseData();
		cout << derivNum << '\n';
		//cout << num1 << ' ' << num2 << " " << num3 << '\n';
	}
};

class DerivedAgain : public SoDerived
{
public:
	void Print()
	{
		cout << num3 << '\n';
	}
};

int main()
{
	//dr3.num3;
	DerivedAgain tmp;
	tmp.Print();
	//tmp.num3; //error
	return 0;
}

 

public 상속 : 접근 제어 권한을 그대로 상속.

protected 상속 : protected보다 접근 범위가 넓은 멤버는 protected로 상속, private는 그대로 접근 불가 상태.

private 상속 : private 보다 접근 범위가 넒은 멤버는 private으로 상속.

 

따라서, SoDerived에서 SoBase 클래스를 protected로 상속했으므로, 

SoBase의 public 변수인 num3은 protected로 접근 범위가 줄어들게 된다. 

 

이 특성을(접근 범위가 줄어듦) 가진 SoDerived를 상속한 DerivedAgain은 num3을 protected로 인식하여,

tmp 인스턴스가 tmp.num3으로 접근 불가능하게 된다. 

 

tmp.num3으로 접근하려면 SoDerived에서 SoBase를 public 상속해주어야 한다.