[cpp] 부모 class의 생성자 호출

minjubyeon·2025년 6월 14일

cpp

목록 보기
23/26
#include <iostream>
#include <vector>

class Base {
private:
    int x; //⚠️ 멤버 변수 x는 private이다. 

public:
    Base(int x = 0) : x(x) {} // 생성자
    int Get() const { return x; } // x 반환
};

class Derived : public Base {
private:
    int y;

public:
    Derived(int x = 0, int y = 0) : Base(x), y(y) {} // x, y 초기화 🔍
    int Get() const { return Base::Get() + y; } // x + y 반환
};

🔍직접 접근할 수 없는데 Base(x)라고 써도 되는가?

Base(x)멤버 초기화가 아니라 생성자 호출입니다.

Derived(int x = 0, int y = 0) : Base(x), y(y) {}

여기서 Base(x)
⚠️ Base 클래스의 private 멤버 x에 직접 접근하는 게 아닙니다!
Base(int) 생성자를 호출해서 Base 내부에서 알아서 private 멤버 x를 초기화하는 것입니다.

즉, 생성자 오버라이딩이 아니라, 기반 클래스 생성자 호출이에요.


📦 예시

class Base {
    int x;
public:
    Base(int a = 0) : x(a) {}   // ✅ 생성자를 통해 x를 초기화
    int Get() const { return x; }
};

class Derived : public Base {
    int y;
public:
    Derived(int a = 0, int b = 0) : Base(a), y(b) {}  // 여기서 Base(x)는 그냥 호출임
    int Get() const { return Base::Get() + y; }
};

이때 Base(a)는 이렇게 동작합니다:

Base::Base(int a) {
    this->x = a;
}

즉, Base 클래스가 자기 생성자 내부에서 x를 처리합니다.
Derived 입장에서는 그냥 “a 값을 Base에 전달”할 뿐입니다.


🔚 결론

  • Derived에서 Base(x)Base 생성자 호출일 뿐이며,
  • Base의 x 멤버가 private이더라도 생성자를 통해 간접적으로 초기화 가능.
  • 오버라이딩은 전혀 필요 없음 (오버라이딩은 멤버 함수 재정의일 때만 해당됨)
표현의미접근 가능 여부
Base(x)생성자 호출 (Base 내부에서 x 초기화)O
x = 10Derived에서 직접 Base의 x를 만지려고 함❌ (x가 private이므로 오류)

📌 참고: 슬라이드 236–237 (Constructor Initializer List), 슬라이드 284 (Base 생성자 호출 순서).



profile
안녕하세요.

0개의 댓글