728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
클래스 상속
지금까지는 기본 클래스의 멤버들이 파생 클래스의 멤버로 확장될 때, public 상속에 대해서만 다루었다. 'public 상속'을 사용하면 Base에 선언된 멤버들은 접근 지정을 그대로 유지한 채 Derived의 멤버로 확장된다.
class Derived : public Base {
...
};
하지만, 'private 상속' 이나 'protected 상속'은 기본 클래스에 선언된 멤버들의 접근 지정을 변경한다.
- public 상속
- 기본 클래스를 public으로 상속받으면, 기본 클래스의 protected, public 멤버들은 접근 지정 변경 없이 파생 클래스에 그래도 상속 확장된다.
- protected 상속
- 기본 클래스를 protected로 상속받으면, 기본 클래스의 protected, public 멤버들은 모두 protected 접근 지정으로 변경되어 파생 클래스에 상속 확장된다.
- private 상속
- 기본 클래스를 private으로 상속받으면, 기본 클래스의 protected, public 멤버들은 모두 private 접근 지정으로 변경되어 파생 클래스에 상속 확장된다.
다만, 상속 접근 지정자가 생략된다면 private 상속으로 처리된다.
class Derived : Base { ... }; // 접근 지정자 생략
class Derived : private Base { ... }; // private 상속으로 자동 처리
private 상속 및 오류 예시
#include <iostream>
using namespace std;
class Base {
int a;
protected:
void setA(int a) { this->a = a; }
public:
void showA() { cout << a; }
};
class Derived : private Base {
int b;
protected:
void setB(int b) { this->b = b; }
public:
void showB() { cout << b; }
};
int main() {
Derived x;
x.a = 5; // 1
x.setA(10); // 2
x.showA(); // 3
x.b = 10; // 4
x.setB(10); // 5
x.showB(); // 6
}
- 컴파일 오류 => a는 Derived 클래스에 상속되지만 private 멤버이므로 접근 불가
- 컴파일 오류 => setA(), showA()는 private 멤버로 변경되어 Derived 클래스에 상속되기 때문에 Derived 클래스 외부에서 접근 불가
- 2번과 마찬가지 이유로 컴파일 오류
- 컴파일 오류 => b는 private 멤버이기 때문에 Derived 클래스 외부에서 접근 불가
- 컴파일 오류 => setB()는 protected 멤버이기 때문에 main()에서 접근 불가
- 정상 컴파일. showB()는 public멤버이기 때문에 누구나 접근 가능
상속이 중첩될 때 접근 지정 예시
#include <iostream>
using namespace std;
class Base {
int a;
protected:
void setA(int a) { this->a = a; }
public:
void showA() { cout << a; }
};
class Derived : private Base {
int b;
protected:
void setB(int b) { this->b = b; }
public:
void showB() {
setA(5); // 1
showA(); // 2
cout << b;
}
};
class GrandDerived : private Derived {
int c;
protected:
void setAB(int x) {
setA(x); // 3
showA(); // 4
setB(x); // 5
}
};
- 정상 컴파일. setA()는 Base 클래스의 protected 멤버이기 때문에 파생 클래스 Derived에게 접근 허용
- 정상 컴파일. showA()는 Base 클래스의 public 멤버이기 때문에 파생 클래스 Derived에게 접근 허용
- 컴파일 오류. setA()는 private 속성으로 변경되어 Derived 클래스에 상속되기 때문에 GrandDerived 클래스에서 접근 불가
- 컴파일 오류. showA()는 private 속성으로 변경되어 Derived 클래스에 상속되기 때문에 GrandDerived 클래스에서 접근 불가
- 정상 컴파일. setB()는 Derived 클래스의 protected 멤버이기 때문에 파생 클래스 GrandDerived에게 접근 허용
728x90
'Programming Language > C++' 카테고리의 다른 글
[C++] 가상 함수와 오버라이딩 (1) | 2023.12.18 |
---|---|
[C++] 다중 상속과 가상 상속 (0) | 2023.12.15 |
[C++] 상속과 생성자, 소멸자 (1) | 2023.12.14 |
[C++] protected 접근 지정 (0) | 2023.12.14 |
[C++] 상속과 객체 포인터 (0) | 2023.12.14 |