정진하는중

[상속] 접근 지정자와 상속 접근 지정자

 

접근 지정자

접근 지정자는 클래스 내부의 멤버(변수와 메서드)에 대한 접근 권한을 설정할 수 있습니다.

 

public

  • 특징 : public 접근 지정자로 선언된 멤버클래스 외부에서도 접근할 수 있습니다.
  • 클래스 내부의 함수에서도 public 멤버에 접근 가능하며 생성된 객체를 통해 외부에서도 멤버에 접근할 수 있다.

protected

  • 특징 : 객체를 통해 클래스 외부에서 직접 접근은 불가능하며, 상속받은 클래스 내에서는 접근할 수 있습니다.
  • A 클래스의 proteced 멤버를, A 클래스를 상속한 B 클래스의 멤버 함수에서도 접근할 수 있다.

private

  • 특징 : 오직 해당 클래스 내에서만 접근할 수 있으며 상속받은 클래스에도 접근할 수 없습니다.
  • 생성자를 private에 두면 해당 객체의 생성 또한 막을 수 있다.
  • 객체의 외부 또는 파생 클래스에서조차 접근할 수 없는 멤버 변수나 함수를 만들기 위해서는 이 지정자를 사용한다.

 

using namespace std;
class Base
{
public:
	Base() { }				// 생성자는 public에 선언하여야 외부에서 객체를 만들 수 있다.
	virtual ~Base() { }		// 가상 소멸자

	void Public_Function()
	{
		cout << "Public 함수 \n" << endl;
	}
protected:
	void Protected_Function()
	{ 
		cout << "Protected 함수 \n" << endl;
		cout << "Base 멤버 변수 : " << m_state << endl;		// private 멤버 변수는 해당 클래스 내부에서는 접근 가능
	}
private:
	int m_state;		    // 외부에서 접근 불가능. 파생 클래스의 내부에서도 접근 불가능
	
	// Base { }			// 생성자가 private 에 선언될 시, 외부에서 객체 생성 불가능
	// virtual ~Base { }    // 만약 이렇게 작성할 시, 상속 받은 클래스의 객체가 delete를 
};

class Derived : public Base
{
public:
	Derived() { }
	
	void Derived_Public_Function()
	{
		Protected_Function();		// 상속 받은 Procted_Function은 파생 클래스 내부에서 사용 가능
	}
};


int main()
{

	Base b1;
	b1.Public_Function();				// 가능. Public 함수
	b1.Protected.Function()				// 불가능. Protected 접근 지정자는 외부에서 접근 불가능
	int test = b1.m_state;				// 불가능. private를 사용하는 방법은 클래스 내부에서 함수로 지원하는 형태여야함.
										// 그 예시로 Protected_Function()

	Derived d1;
	d1.Public_Function();				// 가능. Public 상속받은 Public 함수
	d1.Derived_Public_Function();		// 가능. 내부의 Protected_Function()은 클래스 내부에서 호출됨
	
	return 0;
}

 

상속 접근 지정자

위의 접근 지정자를 상속 과정에서 사용할 수 있다.

 

class Derived : public Base

 

  • Public 상속: public 멤버는 public, protected 멤버는 protected로 상속됩니다.
  • Protected 상속: public 및 protected 멤버가 모두 protected로 상속됩니다.
  • Private 상속: public 및 protected 멤버가 모두 private로 상속됩니다.

 

보통은 public 상속을 받아 기반 클래스의 접근 지정자를 그대로 상속하게 사용할 수 있지만

예외적인 상황을 만들어 본다면, 상속에 계층 구조를 만들 때 다른 지정자를 사용할 수 있다.

 

class Base {
public:
    void publicMethod() {}
protected:
    void protectedMethod() {}
};

class Derived : protected Base {
public:
    void accessBaseMethods() {
        publicMethod();  // 접근 가능
        protectedMethod();  // 접근 가능
    }
};

class MoreDerived : public Derived {
    void accessBaseMethods() {
        // publicMethod();  // 접근 불가
        // protectedMethod();  // 접근 불가
    }
};

 

 


댓글