본문 바로가기
프로그래밍/C++

C++상속 관계에서의 생성자 호출

by Hwan2 2019. 2. 21.
반응형

생성자는 객체를 만들게 되면 자동으로 실행되는 코드 입니다.

 

그럼, 상속관계에서의 생성자 호출은 어떤식으로 진행이 될지?

 

코드로 설명하겠습니다.

 

#include<iostream>

using namespace std;

class A {
public:
    A() {
        cout << "Class A" << endl;
    }
};

int main(void) {
     
    A a;

    return 0;
}
 

 

코드 실행 결과 입니다.

 

이처럼 객체 생성만 해도 생성자는 자동 호출이 됩니다.

 

 

 

그럼 상속을 받으면 생성자 호출은 어떤식으로 될까요?

 

#include<iostream>

using namespace std;

class A {
public:
    A() {
        cout << "Class A!!" << endl;
    }
};

class B : public A {
public :
    B() {
        cout << "Class B!!" << endl;
    }
};


int main(void) {
     
    B b;

    return 0;
}
​

 

 


B객체만 선언해도 이런식으로 생성자 호출이 됩니다.

 


즉, 상속관계에 있을 때 자식 객체를 생성하면!!

맨위 부모 클래스의 생성자 부터 차례대로 생성자 호출이 일어나는 것입니다.

 

생성자가 private이라면???

 

다른 함수에서 객체 선언 시 생성자 호출 자체가 불가능 해 집니다.

 

따라서 생성자는 public으로 선언하는 것이 보통입니다.

 

 

 

하지만!!!! private으로 선언된 생성자도 호출은 가능합니다.

#include<iostream>

using namespace std;

class A {
private:
    int num;
public:
    A() {}
     
    A* createA(int number) {
        A *a = new A(number);
        return a;
    }

    int get() {
        return num;
    }

private:
    A(int num) {
        this->num = num;
    }
};

int main(void) {
     
    A a;

    A *obj = a.createA(10);

    cout << obj->get() << endl;
    return 0;
}

 

 

 

 

이런식으로 private생성자도 호출이 가능합니다. 

단!! 이러한 경우에는 생성자의 호출방법을 제안하고자 할때 쓰이게 됩니다.

 

 

그렇다면 생성자의 매개변수, 인자 값이 다르다면 어떻게 될까요?

#include<iostream>
#include<string>

using namespace std;


class A {
public:
    A() {
        cout << "Class A!!" << endl;
    }
};


class B : public A {
    int num;
    string name;
public :
    B() {
        cout << "Class B!!" << endl;
    }

    B(int num, string name) {
        this->num = num;
        this->name = name;
        printf("Class B!! num = %d, name = %s\n", this->num, this->name.c_str());
    }
};


int main(void) {
     
    B b(10, "Hwan");

    return 0;
}
 

실행 결과

 

즉, 자식 클래스 생성자의 매개변수가 달라져도(오버로딩) 부모 클래스의 기본 생성자 호출은 무조건 일어난다는 뜻이 됩니다.

 

 

 

 

 

그렇다면 부모 생성자도 매개변수로 받는게 있고 그 생성자를 호출하고 싶다면??

 

#include<iostream>
#include<string>

using namespace std;


class A {
private:
    int num;
public:
    A() {
        cout << "Class A!!" << endl;
    }

    A(int num) {
        this->num = num;
        cout << "Class A!!, num = " << this->num << endl;
    }

    int get() {
        return num;
    }
};


class B : public A {
    int num;
    string name;
public:
    B() {
        cout << "Class B!!" << endl;
    }

    B(int num1, int num2, string name) : A(num1) {
        this->num = num2;
        this->name = name;
        printf("Class B!! num = %d, name = %s\n", this->num, this->name.c_str());
    }
};


int main(void) {

    B b(100, 10, "Hwan");

    cout << "Class A : num = " << b.get() << endl;

    return 0;
}
​

 

 

 

이런식으로 초기화해 줄 수 있습니다.

 

그리고 이런식의 초기화 방법을 맴버이니셜라이져 라고 하는데 이에 대해선 다음에 상세히 설명하겠습니다.

반응형

댓글


스킨편집 -> html 편집에서