이번 시간에는 상속할 때 특정 변수를 보호하는 방법중에 하나인 protected 에 대해서 알아보겠습니다.
파생 클래스에서 기반 클래스 변수를 변경하려고 하면 기반 클래스의 해당 변수를 protected 라고 선언하면 변경이 가능하다.
#include <iostream>
class Base
{
protected: //
std::string parent_string;
public:
Base() : parent_string("기반") {
std::cout << parent_string << " 클래스 constructor" << std::endl;
}
void what() { std::cout << parent_string << " 클래스 변수" << std::endl; }
};
class Derived : public Base
{
std::string child_string;
public:
Derived() : Base(), child_string("파생")
{
std::cout << child_string << " 클래스 constructor" << std::endl;
// private 인 Base 의 parent_string 에 접근할 수 없다
// 그래서 Base 의 parent_string 를 protected 로 변경해야 접근 가능하다
parent_string = "바꾸기";
}
};
int main()
{
std::cout << " === 기반 클래스 생성 ===" << std::endl;
Base p;
p.what();
std::cout << " === 파생 클래스 생성 ===" << std::endl;
Derived c;
c.what();
p.what();
return 0;
}
실행결과
private 키워드는 조금 더 보수적으로 접근/변경을 관리한다.
아래의 샘플 코드를 통해서 설명하겠습니다.
#include <iostream>
class Base
{
public: //
std::string parent_string;
public:
Base() : parent_string("기반")
{
std::cout << parent_string << " 클래스 constructor" << std::endl;
}
void what() { std::cout << parent_string << " 클래스 변수" << std::endl; }
};
class Derived : private Base
{
std::string child_string;
public:
Derived() : Base(), child_string("파생")
{
std::cout << child_string << " 클래스 constructor" << std::endl;
}
void what() { std::cout << child_string << " 클래스 변수" << std::endl; }
};
int main()
{
std::cout << " === 기반 클래스 생성 ===" << std::endl;
Base p;
// Base 에서는 parent_string 이 public 이므로
// 외부에서 당연히 접근 가능하다.
std::cout << p.parent_string << std::endl;
std::cout << " === 파생 클래스 생성 ===" << std::endl;
Derived c;
// 반면에 Derived 에서는 parent_string 이
// (private 상속을 받았기 때문에) private 이
// 되어서 외부에서 접근이 불가능하다.
std::cout << c.parent_string << std::endl;
return 0;
}
실행결과 - 아래와 같이 오류가 발생한다.
사용하는 IED 에 따라서 아래와 같이 컴파일전에 오류 메시지를 자동으로 보여줄 수도 있다.
'C++' 카테고리의 다른 글
[C++] 추상 클래스 (abstract class) (0) | 2023.02.18 |
---|---|
[C++] 상속(inheritance) - up casting, virtual (0) | 2023.02.17 |
[C++] 상속(inheritance) (0) | 2023.02.16 |
[C++] 포인터 - 연산자 오버로딩(overloading) (0) | 2023.02.14 |
[C++] 포인터 - 얕은복사/깊은복사(샘플3), 생성자, 소멸자 (0) | 2023.02.03 |