본문 바로가기

C++

C++ 상속

상속이란?

부모의 기능들을 자식이 가져다가 쓰는것이다.

 

상속사용법

상속 선언은 : 접근 제한 자 클래스명을 해주면 된다 만약 전급 제한자를 명시하지 않으면
컴파일러는 자동적으로 private로 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
class Animal
{
public:
    char* name;
    int age;
    Animal() {}
    Animal(const char* name, int age) : age(age)
    {
        strcpy_s(this->name, strlen(name) + 1, name);;
    }
};
 
class  Tiger : public Animal
{
public:
    char* eating;
    Tiger()    { }
    Tiger(const char* name, int age, const char* eating) : Animal(name, age)
    {
        strcpy_s(this->eating, strlen(eating) + 1, eating);;
 
    }
};
 
 
 
int main()
{
    Tiger t("호랑이", 5, "육식");
    cout << t.name << t.age << t.eating << endl;
}
cs

13행 : Animal을 public으로 상속한다.
18행 : 생성자를 호출할 때 자신의 부모 클래스의 생성자도 호출한다.
         만약 호출하지 않으면 부모의 디폴트 생성자가 호출된다.
30행 : name, age는 Tiger의 없지만 사용이 가능하다.

상속을 이용하면 자기가 만든 것이 아닌 다른 클래스의 것도 가져올 수 있다.
동물들은 이름과 나이를 모두 가진다. 만약 호랑이가 아닌 토끼를 만들면
육식동물이 아닌 초식동물들의 기능을 만들어야 하는데 이때 이름과 나이는 만들지 않아도 되는
장점이 존재한다.

 

생성자와 소멸자의 호출순서

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
class AAA
{
public:
    AAA()
    {
        cout << "A생성자 호출" << endl;
    }
    ~AAA()
    {
        cout << "A소멸자 호출" << endl;
    }
};
 
class BBB : public AAA
{
public:
    BBB()
    {
        cout << "B생성자 호출" << endl;
    }
    ~BBB()
    {
        cout << "B소멸자 호출" << endl;
    }
};
 
int main()
{
    BBB* bbb= new BBB();
    delete(bbb);
}
cs

생성자와 소멸자를 출력하는 예제이다.
BBB 객체를 생성하게 되면 부모의 생성자 자식의 생성자가 출력될 것이다.
소멸할 때는 반대로 자식의 소멸자 부모의 소멸자가 출력된다.
여기서 중요한 것은 자식의 소멸 자도 호출되고 부모의 소멸 자도 호출된다는 사실이다.
이러한 객체 소멸의 특성 때문에 상속과 연관된 클래스는
생성자에서 동적 할당한 메모리 공간은 소멸자에서 해제해야 합니다.

 

상속관계에서의 접근제한자

  public 상속 protected 상속 private 상속
public 맴버 public protected 접근불가
protected 맴버 protected protected 접근불가
private 맴버 접근불가 접근불가 접근불가

'C++' 카테고리의 다른 글

C++ 템플릿(template)  (0) 2020.09.24
C++ 함수객체  (0) 2020.09.23
C++ 복사생성자  (0) 2020.09.16
C++ Static  (0) 2020.09.15
C++ Const  (0) 2020.09.14