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
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] upcasting (0) | 2019.11.26 |
---|---|
[C++] 상속에서의 생성자 소멸자 (0) | 2019.11.26 |
[C++] 상속 (0) | 2019.11.24 |
[C++] this 포인터 (0) | 2019.11.24 |
[C++] const member function (0) | 2019.11.17 |