본문 바로가기

C++

[C++] 상속(inheritance) - protected, private 키워드

이번 시간에는 상속할 때 특정 변수를 보호하는 방법중에 하나인 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 에 따라서 아래와 같이 컴파일전에 오류 메시지를 자동으로 보여줄 수도 있다.