2022. 5. 6. 12:21γC++
π‘ λ°μΈλ©, λμ λ°μΈλ©, κ°μ μλ©Έμ
λ°μΈλ©κ³Ό λμ λ°μΈλ© (dynamic binding)
λ°μΈλ©(binding) : ν¨μλ₯Ό νΈμΆν λ μ΄λ€ μ€μ½νμ ν¨μμΈμ§ λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ κ²
virtual
μ μ¬μ©νλ©΄ ν¬μΈν° νμ
(Person)μ λ°λ₯Έ ν¨μκ° μλλΌ, μ μ₯ν κ°μ±(sujilee)μ ν¨μλ₯Ό νΈμΆν μ μλ κ²μ μ κ²μκΈμμ νμΈνμλ€. μ κ·Έλ κ² λμν κΉ?
C++μ μ»΄νμΌλ¬λ ν¨μ νΈμΆ μ ν΄λΉ μ€μ½ν μμ μλ ν¨μλ₯Ό νΈμΆν΄μΌ νκ³ , ν΄λΉ ν¨μκ° ν λΉλ λ©λͺ¨λ¦¬ μ£Όμλ μμμΌνλ€. κ·ΈλμΌ ν΄λΉ ν¨μκ° νΈμΆλμμ λ ν΄λΉ ν¨μμ μμ μ£Όμλ‘ μ νν μ μκΈ° λλ¬Έμ΄λ€.
μ μ λ°μΈλ© | λμ λ°μΈλ© |
---|---|
μ»΄νμΌ μμ νμν ν¨μλ₯Ό λ°μΈλ©. κ°μ ν¨μκ° μλ λ©€λ²λ λͺ¨λ μ μ λ°μΈλ©μ νκ² λλ€. |
κ°μ ν¨μλ λ° νμ μμ ν¨μλ€μ λ°μΈλ©ν΄ μ¬μ©νλ€. |
C++μμλ ν¨μμ μ€λ²λ‘λ© κΈ°λ₯μΌλ‘ μΈν΄ λ°μΈλ© μμ μ΄ λ³΅μ‘ν΄μ§λ€. μΌλ°μ μΈ λ©€λ² ν¨μμ κ²½μ° ν¨μλͺ μ΄ μ€λ³΅λμ§ μκΈ° λλ¬Έμ μ»΄νμΌ μ μ μ λ°μΈλ©μ νλ©΄ κ·Έλ§μΈλ°, μ€λ²λ‘λ©μ μν΄ κ°μ ν¨μλ₯Ό μ¬μ©νκ² λλ©΄ μ»΄νμΌλ¬λ μ΄λ€ ν¨μλ₯Ό νΈμΆν΄μΌνλμ§ λ―Έλ¦¬ μ μ μλ€. λ°λΌμ λ° νμ(νλ‘κ·Έλ¨ μ€ν μ€)μ μ¬λ°λ₯Έ ν¨μκ° μ€νλ μ μλλ‘ λμ λ°μΈλ©μ νλ€.
λͺ¨λ κ°μ ν¨μκ° λμ λ°μΈλ©μ νμ§λ μμ
νμ μ΄ λΆλͺ ν λμλ μ μ λ°μΈλ©, λΆλͺ¨ν΄λμ€ νμ ν¬μΈν°λ μ°Έμ‘°λ₯Ό ν΅ν΄ νΈμΆν μλ λμ λ°μΈλ©
κ°μ μλ©Έμ (virtual destructor)
virtual
ν€μλλ₯Ό μ¬μ©ν΄ ν¬μΈν°λ‘ ν΄λμ€λ₯Ό μ΄μ©νλλ°, λ§μ½ λμ ν λΉμ μ΄μν΄ ν λΉν κ°μ²΄λ₯Ό κ°λ¦¬ν€λ κ²½μ°λ μμ κ²μ΄λ€.
μΌλ°μ μΈ μμ μ μμ±μμ μλ©Έμ νΈμΆκ³Όμ μ μ΄ν΄λ³΄μ
#include <iostream>
class Parent {
public:
Parent() {
std::cout << "Parent class Constructor called" << std::endl;
}
~Parent() {
std::cout << "Parent class Destructor called" << std::endl;
}
};
class Child: public Parent {
public:
Child() {
std::cout << "Child class Constructor called" << std::endl;
}
~Child() {
std::cout << "Child class Destructor called" << std::endl;
}
};
int main() {
Child kid;
}
κ²°κ³Ό
Parent class Constructor called
Child class Constructor called
Child class Destructor called
Parent class Destructor called
μμν΄λμ€ κ°μ²΄λ₯Ό μμ±νλ €λ©΄ λ¨Όμ λΆλͺ¨ ν΄λμ€μ λ©€λ²κ° μ λ¬λμ΄μΌνλ―λ‘, λΆλͺ¨ ν΄λμ€μ μμ±μκ° κ°μ₯ λ¨Όμ νΈμΆλλ€. κ·Έ ν μμν΄λμ€μ μμ±μ νΈμΆ. μλ©Έμλ μμν΄λμ€μ μλ©Έμκ° λ¨Όμ νΈμΆλκ³ κ·Έ λ€μ λΆλͺ¨ν΄λμ€μ μλ©Έμκ° νΈμΆλλ€.
- λ§μ½ λΆλͺ¨ ν΄λμ€μ ν¬μΈν°λ‘λΆν° μμν΄λμ€λ₯Ό νΈμΆνλ κ²½μ°λ μ΄λ¨κΉ?
int main() {
Parent *adult;
Child *kid = new Child;
adult = kid;
delete adult;
}
κ²°κ³Ό
Parent class Constructor called
Child class Constructor called
Parent class Destructor called
μ κ²μκΈμμ μ°λ¦¬λ λΆλͺ¨ ν΄λμ€μ ν¬μΈν°λ‘λΆν° μμν΄λμ€λ₯Ό νΈμΆν κ²½μ°, κ°μ ν¨μλ‘ μ μνμ§ μλ ν¨μλ₯Ό μ€λ²λ‘λ©ν΄ μ¬μ©ν μ λΆλͺ¨ν΄λμ€μ λ©€λ² ν¨μκ° νΈμΆλλ κ²μ νμΈνλ€.
μλ©Έμ λν ν¨μμ΄κ³ , μμν΄λμ€μμ μ€λ²λ‘λ©λ ν¨μλΌκ³ λ³Ό μ μκΈ° λλ¬Έμ μλ©Έμ νΈμΆ μ λΆλͺ¨ν΄λμ€μ μλ©Έμλ§ νΈμΆλλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ΄ λ°λ‘ κ°μ μλ©Έμλ₯Ό μ¬μ©νλ κ²μ΄λ€.
#include <iostream>
class Parent {
public:
Parent() {
std::cout << "Parent class Constructor called" << std::endl;
}
virtual ~Parent() {
std::cout << "Parent class Destructor called" << std::endl;
}
};
class Child: public Parent {
public:
Child() {
std::cout << "Child class Constructor called" << std::endl;
}
virtual ~Child() {
std::cout << "Child class Destructor called" << std::endl;
}
};
int main() {
Parent *adult;
Child *kid = new Child;
adult = kid;
delete adult;
}
κ²°κ³Ό
Parent class Constructor called
Child class Constructor called
Child class Destructor called
Parent class Destructor called
λμ ν λΉμ μ¬μ©νκ³ μ νλ©΄, λ°λμ μλ©Έμλ κ°μ ν¨μλ‘ μ μΈν΄ μμν΄λμ€μ μλ©Έμλ νΈμΆλ μ μλλ‘ νμ
'C++' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Cpp - μμΈμ²λ¦¬ (Exception Handling), try, throw, catch (0) | 2022.05.14 |
---|---|
Cpp - μΆμ ν΄λμ€ (0) | 2022.05.07 |
Cpp - μ€λ²λ‘λ©, μ€λ²λΌμ΄λ©, κ°μ ν¨μ (0) | 2022.05.06 |
cpp - μμ, λ€μ€ μμ (0) | 2022.05.04 |
Cpp - μμ±μ, μλ©Έμ, μ°Έμ‘°λ³μ, μ€λ²λ‘λ© (0) | 2022.05.04 |