본문 바로가기

Language, IDE/C, C++

[C++] 상속 (inheritance)

반응형

C++에서는 상위 클래스로부터의 상속을 제공한다.


상속(inheritance)은 일반적인 뜻의 상속처럼 한 클래스로부터 멤버함수와 멤버변수를 물려받게 되는것을 말한다.

물려주는 클래스를 부모 클래스(parent class)또는 슈퍼 클래스(superclass)또는 기반 클래스(base class)라고 한다. 

그리고 물려받는 클래스는 자식 클래스(child class), 혹은 부 클래스(subclass)또는 파생 클래스(derived class)라고 한다.


상속받은 클래스를 다시 상속받을 수 있고 여러 클래스로부터 상속을 받을수도 있다. 상속받은 클래스를 다시 상속받는 것은 일반적이지만 여러 클래스로부터 상속을 받는 것은 안전하지 않을 수 있다.

여러 클래스로부터 상속받는 것을 다중 상속이라고 하는데 이렇게 되면 두 부모 클래스가 같은 멤버함수명이나 멤버 변수명을 사용하게 되면 어느 것이 상속되는지 등 여러가지 문제가 있을 수 있어 다중 상속은 몇몇 언어에서는 제공하지 않는 경우도 있다. C++에서는 다중 상속을 허용한다. Java에서는 다중상속을 허용하지 않는다.


C++에서 상속은 클래스명정의 부분에 :(콜론)을 사용하여 정의한다. 

class 클래스명 : public 부모클래스명{

};


class Parent {
public:
 Parent(){}
 void func1();
private:
 int mem1;
};

class Child : public Parent {
public:
 Child(){};
private:
};

: 뒤에 예약어 public은 Parent의 public이하의 모든 멤버를 상속받겠다는 의미이다. protected,private를 사용할 수 도있다. 하지만 private를 사용하면 멤버 변수에 직접 접근이 불가능하기 때문에 사실상 부모클래스의 생성자 이외에는 아무것도 사용할 수 없다.


※protected

상속을 받더라도 부모 클래스의 private영역의 함수나 멤버에는 직접 접근할 수 없다. 하지만 부모 클래스의 protected영역에 정의된 함수나 변수는 자식 클래스에서 직접 접근이 가능하다. (private멤버 변수에 접근하기 위해서는 getter나 settet함수를 public이나 protected영역에 정의한후 접근하여야 한다. private멤버 함수에 접근하는 방법은 합법적으로는 없다.)


직접 접근

 

public

protected

private 

클래스내 

 friend함수내

O

 자식 클래스내

클래스 외부(main등)



생성자 및 소멸자

상속된 클래스의 생성자 및 소멸자의 실행 순서는 다음과 같다.

부모 클래스의 생성자 -> 자식 클래스의 생성자 -> 자식 클래스의 소멸자 -> 부모 클래스의 소멸자


#include <iostream>
using namespace std;

class Parent {
public:
 Parent(){cout<<"parent cre"<<endl;}
 ~Parent(){cout<<"parent des"<<endl;}
private:
};

class Child : protected Parent {
public:
 Child() { cout<<"child cre"<<endl;}
 ~Child() { cout<<"child des"<<endl;}
private:

};

int main(){
 Child child;
 return 0;
}


위의 코드를 실행시켜 보면

parent cre

child cre

child des

parent des

가 출력된다.




반응형

'Language, IDE > C, C++' 카테고리의 다른 글

[C++] 예외 처리 (Exception)  (0) 2013.07.06
[C++] 템플릿(template)  (0) 2013.07.06
[C++] 파일 입출력  (0) 2013.07.03
[C++] getline 함수  (0) 2013.07.03
[C++] string to char array(c스트링), char array to string  (0) 2013.07.03