[cpp] Inheritance

minjubyeon·2025년 5월 19일

cpp

목록 보기
5/26
#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 클래스의 생성자를 정의하였다.

1. 생성자 상속

default는 매개변수 없는 생성자만 자동 생성한다.
Derived2(int x = 0)은 매개변수로 값을 받아 부모 클래스 생성자에 전달할 수 있어 더 유연하게 사용할 수 있다.

항목= default사용자 정의 생성자 (int x = 0)
생성자 종류기본 생성자만 있음기본 + 매개변수 생성자 가능
Base 호출 방법자동으로 Base() 호출직접 Base(x) 호출
Derived(5) 가능 여부❌ 안 됨✅ 가능
Derived() 가능 여부✅ 됨 (기본 생성자)✅ 됨 (x = 0 기본값 사용)


Q. Derived2의 default parameter를 int x = 2로 바꿔도 될까?

A. 가능!

class Derived2 : public Base {
public:
    Derived2(int x = 2) : Base(x) {};
};

Derived2() → Base(2) 호출됨
Derived2(10) → Base(10) 호출됨

즉, 기본값만 0에서 2로 바뀐 것이고, 전체 동작은 똑같이 잘 된다.



2. parameter 증가와 생성자 상속

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와는 별개의 변수!

Derived(int x1, int x2)

x1 → 부모 클래스인 Base의 생성자에 전달됨 (Base(x1))
x2 → 자식 클래스인 Derived의 x를 초기화하는 데 사용됨 (x(x2))

Q. Derived 클래스에서 Print() 함수를 호출하면?

A. 자식 클래스(Derived)의 x 값만 출력된다.

Derived d1(1, 2);
d1.Print(); d1.Derived::Print(); // 2 2
d1.Base::Print(); // 1

Q. d1이 선언될 때 Base 클래스의 객체도 선언되는가?

A. 그렇다.

Derived d1;이 선언될 때 Base 클래스의 객체 부분도 함께 생성된다.

profile
안녕하세요.

0개의 댓글