-
c++ 복습 - 접근 지정자를 동반한 상속의 특성.effective c++ & c++ 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 상속해주어야 한다.
'effective c++ & c++' 카테고리의 다른 글
virtual 상속 (0) 2022.10.20 c++복습 - 순수 가상 함수와 추상 클래스 그리고 후위/전위 연산자 (0) 2022.10.13 c++ 복습 및 정리 (0) 2022.10.06 ch02-2. 암시적(디폴트) 함수가 필요 없으면, 확실히 사용을 금하자. (0) 2022.09.26 ch02-1. 생성자, 복사 생성자, 복사 대입 연산자, 소멸자 (2) 2022.09.21