본문 바로가기
C++

[C++] 상속과 접근지정자 정리

by Meaning_ 2022. 12. 3.
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

댓글