#include <iostream>
class Base {
int x;
public:
Base(int x = 0) : x(x) {};
void Print() const {
std::cout << x << ' ';
}
};
class Derived1 : public Base {
public:
Derived1() = default; // ✅ Base(0) 상속
};
→ 매개변수가 없는 생성자 Derived1을 자동으로 정의하였다.
그 생성자는 내부적으로 Base(0)을 호출한다.
class Derived2 : public Base {
public:
Derived2(int x = 0) : Base(x) {}; // ✅ Base(x) 상속
};
→ int 타입의 매개변수 x를 받아 Base(x)로 초기화하는 Derived2 클래스의 생성자를 정의하였다.
default는 매개변수 없는 생성자만 자동 생성한다.
Derived2(int x = 0)은 매개변수로 값을 받아 부모 클래스 생성자에 전달할 수 있어 더 유연하게 사용할 수 있다.
| 항목 | = default | 사용자 정의 생성자 (int x = 0) |
|---|---|---|
| 생성자 종류 | 기본 생성자만 있음 | 기본 + 매개변수 생성자 가능 |
Base 호출 방법 | 자동으로 Base() 호출 | 직접 Base(x) 호출 |
Derived(5) 가능 여부 | ❌ 안 됨 | ✅ 가능 |
Derived() 가능 여부 | ✅ 됨 (기본 생성자) | ✅ 됨 (x = 0 기본값 사용) |
class Derived2 : public Base {
public:
Derived2(int x = 2) : Base(x) {};
};
Derived2() → Base(2) 호출됨
Derived2(10) → Base(10) 호출됨
즉, 기본값만 0에서 2로 바뀐 것이고, 전체 동작은 똑같이 잘 된다.
class Base {
int x; // ✅ 멤버 변수 1개
public:
Base(int x = 0) : x(x) {}; // ⚠️ parameter 1개
void Print() const {
std::cout << x << ' ';
}
};
class Derived : public Base {
int x; // ✅ 멤버 변수 2개
public:
Derived(int x1 = 0, int x2 = 0) : Base(x1), x(x2) {}; // ⚠️ parameter 2개
void Print() const {
std::cout << x << ' ';
}
};
Base 클래스에는 int x가 있음
Derived 클래스에도 int x가 또 있음
→ Base의 x와는 별개의 변수!
x1 → 부모 클래스인 Base의 생성자에 전달됨 (Base(x1))
x2 → 자식 클래스인 Derived의 x를 초기화하는 데 사용됨 (x(x2))
Derived d1(1, 2);
d1.Print(); d1.Derived::Print(); // 2 2
d1.Base::Print(); // 1
Derived d1;이 선언될 때 Base 클래스의 객체 부분도 함께 생성된다.