π― ν΅μ¬ μμ½
ν΄λμ€μ μμμ μ¬μ©ν λ λΆλͺ¨ ν΄λμ€μ μλ©Έμκ° virtualμ΄ μλλ©΄,
μμ ν΄λμ€ ν¬μΈν°λ₯Ό λΆλͺ¨ ν΄λμ€ ν¬μΈν°λ‘ μμ ν λ,
μμ ν΄λμ€μ μλ©Έμκ° νΈμΆλμ§ μμμ 리μμ€ λμκ° λ°μν μ μκΈ° λλ¬Έ.
π μν© μμ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Base {
public:
~Base() { std::cout << "Base destructor\n"; }
};
class Derived : public Base {
public:
~Derived() { std::cout << "Derived destructor\n"; }
};
int main() {
Base* ptr = new Derived();
delete ptr; // β λ¬Έμ λ°μ!
}
|
cs |
π₯ μΆλ ₯ κ²°κ³Ό
Base destructor
Derivedμ μλ©Έμκ° νΈμΆλμ§ μμ΅λλ€.
λ§μ½ Derivedμμ λμ μΌλ‘ ν λΉν 리μμ€κ° μμΌλ©΄ λ©λͺ¨λ¦¬ λμκ° λ°μνλ κ² μ λλ€.
β ν΄κ²° λ°©λ² λ° κ²°λ‘
1
2
3
4
|
class Base {
public:
virtual ~Base() { std::cout << "Base destructor\n"; }
};
|
cs |
μ΄λ κ² νλ©΄ delete ptr μμ κ°μ μλ©Έμ 체μΈμ λ°λΌκ°λ©° Derived → Base μμλ‘ μλ©Έμκ° λͺ¨λ νΈμΆλλ€.
μ¦, λ€νμ±μ μ¬μ©ν κ²½μ° (Base* ptr = new Derived();) λΆλͺ¨ ν΄λμ€μ μλ©Έμλ λ°λμ virtualλ‘ μ μΈν΄μΌ μμ ν©λλ€.
κ·Έλ μ§ μμΌλ©΄ μμ μλ©Έμκ° νΈμΆλμ§ μμ λ©λͺ¨λ¦¬ λμ, 리μμ€ λλ½ λ±μ λ¬Έμ κ° μκΈΈ μ μμ΅λλ€.
λλ¬Έμ, μμλ μ¬μ§κ° μλ Base ν΄λμ€λ€μ λ°λμ μλ©Έμλ₯Ό virtualλ‘ λ§λ€μ΄μ£Όλ μ΅κ΄μ κΈ°λ₯΄λ©΄ μ’λ€.
π‘μΆκ° ν
C++11 μ΄νμλ virtual ~Base() = default; κ°μ΄ default virtual μλ©Έμλ μμ£Ό μ΄λ€.
μΆμ ν΄λμ€μ κ²½μ° pure virtual μλ©Έμ virtual ~Base() = 0; λ κ°λ₯νκ³ κ΅¬νμ νμ.
π―default virtual μλ©Έμλ?
C++11λΆν°λ μλ©Έμλ₯Ό μλ μμ±νλ©΄μλ, κ°μμΌλ‘ λ§λ€ μ μλ€.
π μ€λͺ
1
2
3
4
|
class Base {
public:
virtual ~Base() = default;
};
|
cs |
virtual | λ€νμ± μ¬μ© μ μμ μλ©Έμλ μμ νκ² νΈμΆλκ² ν¨ |
= default | μ»΄νμΌλ¬κ° μλ©Έμ λ³Έλ¬Έμ μλμΌλ‘ λ§λ€μ΄μ€ (λ΄μ© μμ) |
μ¦, μ΄ μλ©Έμκ° κ°μμ΄μ΄μΌ νκ³ , λ³λ λ΄μ©μ λΆνμ νλ μ»΄νμΌλ¬κ° μμμ κΈ°λ³Έ μλ©Έμλ₯Ό λ§λ€μ΄μ€! λΌλ λ»μ΄λ€.
κ·ΈλΌ μ΄κ±΄ μΈμ μ¬μ©νλλ?
λ³΄ν΅ μΆμ ν΄λμ€, μΈν°νμ΄μ€ μν ν΄λμ€μμ λ³λ 리μμ€ μ 리λ μκ³ μμ μλ©Έμκ° μ λλ‘ νΈμΆλκ²λ§ νκ³ μΆμ λ μ¬μ©νλ€.
μμλ‘, μλμ κ°μ λ μ¬μ©νλ€κ³ λ³Έλ€.
1
2
3
4
5
|
class IAnimal {
public:
virtual void speak() = 0;
virtual ~IAnimal() = default;
};
|
cs |
π¬ μΆκ° κΆκΈμ¦
κ·Έλ λ€λ©΄ = default, = delete, = 0
κ°κ°μ΄ μ΄λ¨ λ μ°μ΄κ³ , μ΄λ»κ² λ€λ₯ΌκΉ?
C++μλ νΉμν ν¨μ μ μΈμκ° μλλ°, μ΄ 3μ’ μ λΉκ΅ν΄λ³Έλ€λ©΄ μλμ κ°λ€.
νν | μλ―Έ | μμ | μ€λͺ |
= default | κΈ°λ³Έ ꡬνμ λͺ μμ μΌλ‘ μμ² | Base() = default; | μ»΄νμΌλ¬κ° κΈ°λ³Έ μμ±μ/μλ©Έμ λ±μ μλμΌλ‘ μμ± |
= delete | μ¬μ© κΈμ§ | Base(const Base&) = delete; | λ³΅μ¬ μμ±μλ₯Ό κΈμ§ν΄μ λ³΅μ¬ λΆκ°λ₯νκ² λ§λ¦ |
= 0 | μμ κ°μ ν¨μ(Pure Virtual) | virtual void foo() = 0; | μμ ν΄λμ€κ° λ°λμ ꡬνν΄μΌ ν¨ (μΆμ ν΄λμ€) |
πΉ = default
1
2
3
4
5
6
7
|
class A {
public:
A() = default; // κΈ°λ³Έ μμ±μ
A(const A&) = default; // λ³΅μ¬ μμ±μ
A& operator=(const A&) = default; // λ³΅μ¬ λμ
μ°μ°μ
virtual ~A() = default; // κΈ°λ³Έ virtual μλ©Έμ
};
|
cs |
- λ³Έλ¬Έ μμ΄ μ»΄νμΌλ¬κ° λ§λ€μ΄μ€
- 볡μ¬/μ΄λ μμ±μ, μλ©Έμ λ±μ μμ£Ό μ¬μ©
- μλλ₯Ό λͺ ννκ² ννν¨, κ°λ μ±μ μ’μ
πΉ = delete
1
2
3
4
5
6
|
class B {
public:
B() = default;
B(const B&) = delete; // λ³΅μ¬ μμ±μ μμ
B& operator=(const B&) = delete; // λ³΅μ¬ λμ
μμ
};
|
cs |
- ν¨μ μ체λ₯Ό κΈμ§μν΄
- μ±κΈν€, μ νΈλ¦¬ν° ν΄λμ€ λ±μμ 볡μ¬/μ΄λ λ°©μ§ν λ μ¬μ©
- μλμΉ μμ μ¬μ©μ λ°©μ§ (μ€λ²λ‘λ μΆ©λ, μλνμ§ μμ ν λ³ν)
- νΈμΆνλ €νλ©΄ μ»΄νμΌ μλ¬!
πΉ = 0
1
2
3
4
5
6
7
|
class Animal {
public:
virtual void speak() = 0; // μμ κ°μ ν¨μ
virtual ~Animal() = 0; // μμ κ°μ μλ©Έμλ κ°λ₯ (λ¨, ꡬνμ κΌ ν΄μ€μΌ ν¨)
};
Animal::~Animal() {} // μλ©Έμλ λͺΈμ²΄ κΌ μμ΄μΌ ν¨!
|
cs |
- μμ κ°μ ν¨μ ν¬ν¨ → κ°μ²΄ μμ± λΆκ°μ μΆμ ν΄λμ€(μ€κ³λ)κ° λ¨
- μμ ν΄λμ€κ° λ°λμ override ν΄μΌ ν¨
- μΈν°νμ΄μ€ μν ν΄λμ€μμ μ¬μ©
- ꡬνμ κ°μ
'NOTE > Programming' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++] Raw String Literal (0) | 2023.11.13 |
---|---|
[C#] abstract(μΆμ) ν΄λμ€μ μνμ±. (0) | 2018.04.01 |
[C#] Reflection && Attributes (0) | 2018.04.01 |
[C#] 컬λ μ (0) | 2018.04.01 |
[C#] μμΈμ²λ¦¬ (0) | 2018.04.01 |