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 상속해주어야 한다.