728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

클래스 상속

지금까지는 기본 클래스의 멤버들이 파생 클래스의 멤버로 확장될 때, 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
}

 

  1. 컴파일 오류 => a는 Derived 클래스에 상속되지만 private 멤버이므로 접근 불가
  2. 컴파일 오류 => setA(),  showA()는 private 멤버로 변경되어 Derived 클래스에 상속되기 때문에 Derived 클래스 외부에서 접근 불가
  3. 2번과 마찬가지 이유로 컴파일 오류
  4. 컴파일 오류 => b는 private 멤버이기 때문에 Derived 클래스 외부에서 접근 불가
  5. 컴파일 오류 => setB()는 protected 멤버이기 때문에 main()에서 접근 불가
  6. 정상 컴파일. 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
	}
};

 

  1. 정상 컴파일. setA()는 Base 클래스의 protected 멤버이기 때문에 파생 클래스 Derived에게 접근 허용
  2. 정상 컴파일. showA()는 Base 클래스의 public 멤버이기 때문에 파생 클래스 Derived에게 접근 허용
  3. 컴파일 오류. setA()private 속성으로 변경되어 Derived 클래스에 상속되기 때문에 GrandDerived 클래스에서 접근 불가
  4. 컴파일 오류. showA()는 private 속성으로 변경되어 Derived 클래스에 상속되기 때문에 GrandDerived 클래스에서 접근 불가
  5. 정상 컴파일. setB()는 Derived 클래스의 protected 멤버이기 때문에 파생 클래스 GrandDerived에게 접근 허용

 

 

728x90