프로그래밍/C++

[C++] 상속과 접근 지정자 (access specifiers)

갓똥 2019. 11. 25. 00:52
728x90
반응형

1. 상속과 접근 지정자 (access specifiers)

class Base {
private:
    int a;
public:
    int c;
};

class Derived : public Base {
};

int main() {
    Derived derv;
    derv.a = 10; // error
    derv.c = 10; // ok
}

 

위 코드는 Base를 기반 클래스로 Derived클래스가 상속받았다.
따라서 Derived클래스에는 적혀있진 않지만 a와 c 멤버데이터가 있다.
main함수에서 a와 c에 접근하려 하는데 c는 public이라 상관없지만
a는 private으로 외부에서 접근할 수 없으므로 에러가 난다.
그렇다면 다음 코드는 어떨까?

 

class Base {
private:
    int a;
public:
    int c;
};

class Derived : public Base {
public:
    void tmp() {
        a = 10; // error
        c = 10; // ok
    }
};

int main() {
    Derived derv;
    derv.a = 10; // error
    derv.c = 10; // ok
}

 

이번엔 Derived클래스 내부에 tmp함수를 만들었다.
tmp함수는 a와 c에 접근하는데 Derived클래스는 Base클래스를 상속받은 상태이다. 이 경우는 어떨까?
결론은 a에 접근할 때 에러가 난다. 
private은 상속받은 클래스라도 외부에서 접근을 못하게 한다.
그래서 등장한 것이 protected이다.

 

class Base {
private:
    int a;
protected:
    int b;
public:
    int c;
};

class Derived : public Base {
public:
    void tmp() {
        a = 10; // error
        b = 10; // ok
        c = 10; // ok
    }
};

int main() {
    Derived derv;
    derv.a = 10; // error
    derv.b = 10; // error
    derv.c = 10; // ok
}

 

 


2. private VS protected

#include <iosteram>
#include <string>

class Person {
    std::string name;
    int age;
};

class Student : public Person {
    int id;
public:
    void print() const {
        std::cout << name << std::endl;
        std::cout << age  << std::endl;
        std::cout << id   << std::endl;
    }
};

int main() {
}

 

위 코드에서 name과 age는 private이기 때문에 
Student클래스에서 print함수에서 에러가 난다.
해결 방법으로는 2가지가 있다.

 

public:
    int getAge() const { return age; }

 

1. Person 클래스 내부에 멤버 데이터의 값을 리턴해주는 함수를 제공

  ① private

    => 파생 클래스에서도 접근할 수 없다.

    => 값을 변경하거나 얻으려면 기반 클래스의 멤버함수를 사용해야 한다.

 

class Person {
protected:
    std::string name;
    int age;
};

 

2. 멤버데이터를 protected로 제공

  ② protected

    => 외부에서는 접근할 수 없지만 파생 클래스에서는 직접 접근할 수 있다.

728x90
반응형