[상속] 접근 지정자와 상속 접근 지정자
접근 지정자
접근 지정자는 클래스 내부의 멤버(변수와 메서드)에 대한 접근 권한을 설정할 수 있습니다.
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(); // 접근 불가
}
};
'개념과 활용 > C++' 카테고리의 다른 글
[C++] new [], delete [] (0) | 2024.06.18 |
---|---|
[연산자 오버로딩] 연산자 오버로딩과 반환 값 (0) | 2024.06.14 |
[복사 생략] 이동 생성자와 이동 대입 연산자 (0) | 2024.06.11 |
[복사 생략] 복사 생략 (0) | 2024.06.11 |
[다형성] 추상 클래스와 가상 함수 테이블 (0) | 2024.06.08 |
댓글