갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 롤 골드그래프
  • 유니티 그래프
  • pc 게임 순위
  • pc게임 순위
  • 전세계게임매출순위
  • 모바일 게임 순위
  • 알고리즘
  • c# collection
  • Unity Graph
  • C++ 상속
  • 유니티 그래프 그리기
  • 자바
  • C# boxing
  • C# 예외 처리
  • 강남 방탈출
  • 게임 디자인 패턴
  • C++ virtual
  • c# Thread
  • 2020년 게임 매출
  • C++
  • 게임 매출 순위
  • c# delegate
  • 게임매출순위
  • 유니티 골드그래프
  • c# coroutine
  • 글로벌게임매출
  • c# 코루틴
  • 전세계 게임 매출
  • c# unboxing
  • C++ 소멸자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥
프로그래밍/C++

[C++] 상속에서의 생성자 소멸자

[C++] 상속에서의 생성자 소멸자
프로그래밍/C++

[C++] 상속에서의 생성자 소멸자

2019. 11. 26. 00:32
728x90
반응형

1. 상속에서의 생성자 소멸자

#include <iostream>
using namespace std;

class Base {
    int data;
public:
    Base()      { cout << "Base()"    << endl; }
    Base(int a) { cout << "Base(int)" << endl; }
    ~Base()     { cout << "~Base()"   << endl; }
};

class Derived : public Base {
public:
    Derived()      { cout << "Derived()"    << endl; }
    Derived(int a) { cout << "Derived(int)" << endl; }
    ~Derived()     { cout << "~Derived()"   << endl; }
};

int main() {
    Derived d;
}

 

실행결과

Base()
Derived()
~Derived()
~Base()

  ① 파생 클래스의 객체 생성시 생성자/소멸자 호출순서

    => 기반 클래스 생성자 / 파생 클래스 생성자

    => 파생 클래스 소멸자 / 기반 클래스 소멸자

 

int main() {
    Derived d(5);
}

 

실행결과

Base()
Derived(int)
~Derived()
~Base()

  ② 파생 클래스의 객체 생성시 인자가 있을 때

    => 기반 클래스 생성자는 디폴트 생성자 호출

    => 기반 클래스의 다른 생성자를 호출하려면 명시적으로 호출해야 한다.

 

    Derived(int a) : Base(a) { cout << "Derived(int)" < endl; }

 


2. 생성자/소멸자 호출의 정확한 원리

#include <iostream>
using namespace std;

class Base {
    int data;
public:
    Base()      { cout << "Base()"    << endl; }
    Base(int a) { cout << "Base(int)" << endl; }
    ~Base()     { cout << "~Base()"   << endl; }
};

class Derived : public Base {
public:
    Derived()      { cout << "Derived()"    << endl; }
    Derived(int a) : Base(a) { cout << "Derived(int)" << endl; }
    ~Derived()     { cout << "~Derived()"   << endl; }
};

int main() {
    Derived d(5);
}

  ① 정확한 원리

    => 파생 클래스의 생성자에서 기반 클래스의 생성자를 호출하는 코드를 컴파일러가 생성해 주는 것

 

#include <iostream>
using namespace std;

class Base {
    int data;
public:
    Base()      { cout << "Base()"    << endl; }
    Base(int a) { cout << "Base(int)" << endl; }
    ~Base()     { cout << "~Base()"   << endl; }
};

class Derived : public Base {
public:
    Derived()      : Base() { cout << "Derived()"    << endl; }
    Derived(int a) : Base() { cout << "Derived(int)" << endl; }
    ~Derived()     { cout << "~Derived()"   << endl; ~Base(); }
};

int main() {
    Derived d;
}

 


3. 상속에서의 생성자/소멸자 예제

// 1
class Animal {
public:
    Animal() {}
};

// 2
class Animal {
private:
    Animal() {}
};

// 3
class Animal {
protected:
    Animal() {}
};

class Dog : public Animal {
public:
    Dog() : Animal() {}
};

int main() {
    Animal a;
    Dog    d;
}

 

위의 코드에서 1 , 2 , 3번 코드 중 error가 나는 코드는 무엇일까?
    => 2, 3

  ① protected 생성자

    => 자기 자신은 객체를 만들 수 없지만 (추상적인 존재)

    => 파생 클래스의 객체는 만들 수 있게 하는 의미

 


4. 주의사항

#include <string>

class Person {
    std::string name;
    int age;
public:
    Person( std::string n, int a ) : name(n), age(a) {}
};

class Student : public Person {
    int id;
public:
    Student()      : id(0) {}
    Student(int i) : id(i) {}
};

int main() {
    Student s1;
    Student s2(100);
}

 

위의 코드는 얼핏봐선 문제 없어서 보이지만 컴파일 시 에러가 난다.
위의 2번에서 설명했던 것처럼 상속을 받으면 컴파일러가 Student : Person() 과 같이 디폴트 생성자를 붙여주는데
디폴트 생성자가 없기 때문에 발생한 에러이다.
#include <string>

class Person {
    std::string name;
    int age;
public:
    Person( std::string n, int a ) : name(n), age(a) {}
};

class Student : public Person {
    int id;
public:
    Student()      : Person("unknown", 0), id(0) {}
    Student(std::string n, int a, int i)
                   : Person(n, a), id(i) {}
};

int main() {
    Student s1;
    Student s2("kim", 20, 100);
}

  ① 기반 클래스에 디폴트 생성자가 없다면

    => 파생 클래스를 만들 때 반드시 기반 클래스의 생성자를 명시적으로 호출해야 한다.

    => 기반 클래스의 생성자를 명시적으로 호출하는 코드는 구현부(소스파일)에 작성한다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] 가상 함수 (virtual function)  (2) 2019.11.26
[C++] upcasting  (0) 2019.11.26
[C++] 상속과 접근 지정자 (access specifiers)  (1) 2019.11.25
[C++] 상속  (0) 2019.11.24
[C++] this 포인터  (0) 2019.11.24
  • 1. 상속에서의 생성자 소멸자
  • 2. 생성자/소멸자 호출의 정확한 원리
  • 3. 상속에서의 생성자/소멸자 예제
  • 4. 주의사항
'프로그래밍/C++' 카테고리의 다른 글
  • [C++] 가상 함수 (virtual function)
  • [C++] upcasting
  • [C++] 상속과 접근 지정자 (access specifiers)
  • [C++] 상속
갓똥
갓똥
공부하며 알아가는 내용을 정리해 봅니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.