728x90
반응형
class Base {
int a;
protected:
void setA(int a) {
this->a = a;
}
void showA() {
cout << a << endl;
}
};
class Derived :private Base {
int b;
protected:
void setB(int b) {
this->b = b;
}
public:
void showB() {
setA(5); //얘네는 여전히 접근이 됨 (protected이기 때문)
showA(); //얘도 protected이기 때문에 접근가능
cout << b << endl;
}
};
class GrandDerived :private Derived {
int c;
protected:
void setAB(int x) {
//setA(x); // 컴파일 오류 -> 상속이 private으로 되면 접근이 안된다 -> setA()와 showA()는 private인 상태에서 이미 GrandDerived에 온거고
//showA();
//여긴 GrandDerived에 오면서 private이 됨
setB(x);// Derived에서 접근제어자가 protected이기 때문에 접근 가능
showB();// Derived에서 접근제어자가 protected이기 때문에 접근 가능
}
};
상속할 때 상속할 클래스 앞에 접근지정자를 써주는데 이건 필드에서 접근지정자 지정할 때랑 살짝 차이가 있다.
public으로 상속받으면 기반 클래스의 속성 접근 지정자의 의미를 그대로 두어 상속. 단 원래 private인 속성은 접근 불가.
private 상속은 기반 클래스의 속성 접근 지정자의 의미를 private으로 만든다. 단 원래 private인 속성은 접근 불가.
protected 상속은 기반 클래스의 속성 접근 지정자의 의미를 최소 protected로 만든다. 단 원래 public -> protected , 나머지는 그대로. 단 원래 private 속성은 접근 불가.)
위 예제처럼 private 상속은 기반 클래스의 private 멤버는 파생 클래스에 접근 불가능하다.
근데 기반 클래스에서 public,protected 속성은 private 속성으로 변경되는데
이때는 파생클래스에서 private 속성으로 상속받았다는 뜻이므로 파생클래스 정의부에서는 접근이 가능.
즉 setA는 Derived에서는 접근이 되지만 GrandDrived에서 부터는 private으로 접근제어가 바뀌기 때문에 컴파일 에러가 뜨는 것.
가상함수랑 오버라이딩은 묶여서 같이 나오니 기억할 것!
728x90
반응형
'C++' 카테고리의 다른 글
[C++] 명품 c++ 6장 (0) | 2022.12.04 |
---|---|
[C++] 순수가상함수와 추상클래스 (0) | 2022.12.04 |
[C++] 프렌드와 연산자 오버로딩 (0) | 2022.10.31 |
[명품 c++] 3장 실습문제 (0) | 2022.10.18 |
[C++] 명품 C++ 4장 찝어준거 정리 (0) | 2022.10.14 |
댓글