#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 생성자 호출일 뿐이며,x 멤버가 private이더라도 생성자를 통해 간접적으로 초기화 가능.| 표현 | 의미 | 접근 가능 여부 |
|---|---|---|
Base(x) | 생성자 호출 (Base 내부에서 x 초기화) | O |
x = 10 | Derived에서 직접 Base의 x를 만지려고 함 | ❌ (x가 private이므로 오류) |
📌 참고: 슬라이드 236–237 (Constructor Initializer List), 슬라이드 284 (Base 생성자 호출 순서).