κ°μν¨μ(virtual function), ν¨μ μ¬μ μ (function redefine)
π κ°μ ν¨μ(virtual function)
κ°μ ν¨μλ μμ κ°μ ν¨μ(pure virtual class)μ μΌλ° κ°μ ν¨μ(virtual class)λ‘ κ΅¬λΆλμ΄ μ¬μ©λλ€. λ λ€ κ°μ ν¨μ μ΄κΈ° λλ¬Έμ κΈ°λ³Έ κ°λ μ κ°κ³ μ¬μ© λ°©λ²μ μ°¨μ΄λ§ μλ€. κ°μ ν¨μμ κΈ°λ³Έ κ°λ μ λ€μκ³Ό κ°λ€.
κ°μν¨μλ₯Ό μ¬μ©νκ² λλ©΄ λΆλͺ¨ ν΄λμ€μμ μ μΈν ν¨μκ° μμ ν΄λμ€μμ μ¬μ μ λ μ μλ€κ³ μλ €μ£Όκ² λμ΄ κΈ°λ³Έ ν΄λμ€ νμ μ ν¬μΈν° λλ μ°Έμ‘°λ₯Ό ν΅ν΄ μμ ν΄λμ€μ κ°μ²΄λ₯Ό μ°Έμ‘°νμ¬ ν΄λΉ κ°μ²΄μ λν ν¨μλ₯Ό μ€νν μ μκ² λλ€.
βΆ μΌλ° κ°μ ν¨μ(virtual function)λ λΆλͺ¨ ν΄λμ€μμ μ μΈν λ©μλλ₯Ό μμ ν΄λμ€μμ μ¬μ μν΄μ μ¬μ©ν΄λ λλ€λ κ°λ₯μ±μ μ΄μ΄λλ κ²μ΄λ€. μμ μ€λ²λΌμ΄λ©μμ νλ κ²μ²λΌ λΆλͺ¨ ν΄λμ€μμλ ν¨μμ κΈ°λ₯μ΄ μ μλμ΄ μκ³ νμνλ€λ©΄ κΈ°λ₯μ νμ₯νκ±°λ λ³κ²½νλλ° virtual ν€μλλ₯Ό ν΅ν΄ ν¬μΈν° νμ μ΄ μλ μ°Έμ‘°νλ κ°μ²΄μ λ©μλλ₯Ό μ¬μ©νκΈ° μν΄ λΆμ΄κ² λλ€.
βΆ μμ κ°μ ν¨μ(pure virtual function)λ μμ ν΄λμ€μμ λ°λμ μ¬μ μν΄μ μ¬μ©ν΄μΌ νλ λ©μλλ₯Ό λ»νλ€. λ°λΌμ λΆλͺ¨ ν΄λμ€μμ ν¨μμ κΈ°λ₯μ΄ μ μλμ΄ μμ§ μμΌλ©° μμ ν΄λμ€μμ μ¬μ μνμ§ μμΌλ©΄ μ¬μ©μ΄ λΆκ°λ₯νλ€.
πλ¬Έλ²
class ν΄λμ€λͺ
{
virtual λ©€λ² ν¨μμ μν; //μΌλ° κ°μ ν¨μ
virtual λ©€λ² ν¨μμ μν = 0; //μμ κ°μ ν¨μ
};
λΆλͺ¨ ν΄λμ€μμ virtualμ ν΅ν΄ ν¨μλ₯Ό μ μΈνλ©΄ μμ ν΄λμ€μμ μ¬μ μν ν¨μ λν μλμΌλ‘ virtual ν¨μκ° λκΈ° λλ¬Έμ μμ ν΄λμ€μμ virtualμ μλ΅ν΄λ λμ§λ§ κ°μ ν¨μμμ λͺ μνκΈ° μν΄ μμ ν΄λμ€μμλ virtual ν€μλλ₯Ό λΆμ¬μ£Όλ κ²μ΄ μ’λ€.
π κ°μ ν¨μμ ꡬν μ리
λͺ¨λ ν¨μλ₯Ό κ°μν¨μλ‘ λ§λ€λ©΄ νΈν κ² κ°μ§λ§, μ¬μ€ κ°μν¨μλ μ€λ²ν€λκ° ν¬λ€. μλνλ©΄ virtual ν¨μλ λ°νμμ μ΄λ€ ν¨μκ° μ€νν μ§λ₯Ό κ²°μ νλ λμ λ°μΈλ© λ°©μμ΄κΈ° λλ¬Έμ΄λ€.
C++ μ»΄νμΌλ¬λ κ°μ ν¨μκ° νλλΌλ μ‘΄μ¬νλ ν΄λμ€μ λν΄ κ°μ ν¨μ ν μ΄λΈ(virtual function table; vtable)μ μμ±νλ€.
pμ κ²½μ°, func1μ΄ κ°μν¨μμ΄λ―λ‘, κ°μν¨μ ν μ΄λΈμ ν λ² λ μ°Έμ‘°νμ¬ Parent::func1()μ νΈμΆνκ² λκ³ , cμ κ²½μ°μλ λ§μ°¬κ°μ§λ‘ κ°μν¨μ ν μ΄λΈμ μ°Έμ‘°νμ¬ Child::func1()μ νΈμΆνκ² λλ€. μ΄λ μ€λ²ν€λκ° μΆκ°λλ κ²μ μλ―Ένλ―λ‘, C++μ λ©€λ² ν¨μλ λν΄νΈλ‘ κ°μν¨μκ° λλλ‘ λ§λ€μ΄μ§μ§ μμ κ²μ΄λ€.
πκ°μ ν¨μμ μμ κ°μ ν¨μλ₯Ό μμ
λ€μκ³Ό κ°μ΄ Car ν΄λμ€μ SuperCar ν΄λμ€λ₯Ό μ μΈνκ³ Car ν΄λμ€ νμ μ ν¬μΈν° λ³μμ SuperCar ν΄λμ€λ‘ λ§λ κ°μ²΄μ μ£Όμλ₯Ό λ΄μμ£Όλ©΄ SuperCarμ Speed() ν¨μλ₯Ό νΈμΆν κ² κ°μ§λ§ κ·Έλ μ§ μκ³ ν¬μΈν° νμ μ ν΄λΉνλ ν΄λμ€μ ν¨μλ₯Ό νΈμΆνλ κ²μ νμΈν μ μλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ κ°μ ν¨μλ₯Ό μ¬μ©νλ€.
μΌλ° κ°μ ν¨μλ₯Ό ν΅ν΄ SpeedλΌλ ν¨μκ° μμν΄λμ€μμ μ¬μ μλμ΄ μ¬μ©λ μ μλ€κ³ μλ €μ£ΌκΈ° λλ¬Έμ Car νμ μ ν¬μΈν° λ³μλ‘ scarμ κ°μ²΄μ μ£Όμλ₯Ό λ΄μ μ¬μ©νλ©΄ κ·ΈλλΆν° ν΄λΉ κ°μ²΄μ λ©μλλ₯Ό μ¬μ©ν μ μκ² λλ€.
λΆλͺ¨ ν΄λμ€μμ μμ κ°μ ν¨μλ‘ μ μΈλμ΄ μκΈ° λλ¬Έμ μμ ν΄λμ€μμ ν¨μλ₯Ό μ¬μ μ νμ§ μμ κ²½μ° μ¬μ©ν μ μλ κ²μ νμΈν μ μλ€.
μμν΄λμ€μμ μμ κ°μ ν¨μλ‘ μ μΈλ ν¨μλ 무쑰건 μ¬μ μνμ¬μΌ νλ©° μΌλ° κ°μ ν¨μμ λκ°μ΄ Carνμ μ ν¬μΈν° λ³μλ‘ μμ κ°μ²΄λ₯Ό λ΄μ μ¬μ©ν μ μκ² λλ€.
μμ κ°μ ν¨μμ μΌλ° κ°μ ν¨μμ κΈ°λ₯μ μΈ μ°¨μ΄λ μμΌλ©° μ€κ³νλ νλ‘κ·Έλλ°μ λ§κ² 골λΌμ μ¬μ©νλ©΄ λλ€.
π ν¨μ μ¬μ μ (function redefine)
ν¨μλ νμ ν΄λμ€μμ κΈ°λ³Έ ν΄λμ€μ λμΌν νμμ ν¨μλ₯Ό μ¬μ μνμ¬ μ¬μ©νλ κ²μ΄λ€.
λ€μκ³Ό κ°μ΄ CarκΈ°λ³Έ ν΄λμ€λ₯Ό μμν νμ ν΄λμ€ NomalCar,SuperCarλ
Carμ λ©€λ² ν¨μμΈ Speed()λ₯Ό μ¬μ μνμ¬ κ΅¬ννμλ€.
πνμ ν΄λμ€ ν¬μΈν° -> νμ ν΄λμ€ κ°μ²΄μ ν¨μ νΈμΆ
νμ ν΄λμ€ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ νμ ν΄λμ€ ν¬μΈν°λ‘
μ¬μ μλ ν¨μλ₯Ό νΈμΆνλ©΄, νμ ν΄λμ€μ μμ±λ λ©€λ²λ₯Ό κΈ°λ³Έμ μΌλ‘ νΈμΆνλ€.
μλμμ νμ ν΄λμ€μ ν¬μΈν° pt_carμ΄ νμ ν΄λμ€ κ°μ²΄ Aλ₯Ό κ°λ¦¬ν¬ λ Speed()λ₯Ό νΈμΆνλ©΄,
νμ ν΄λμ€μμ μ¬μ μλ NomalCarμ λ©€λ² Speed()κ° νΈμΆλλ€.
μ¬μ μ λκΈ° μ΄μ μ, κΈ°λ³Έ ν΄λμ€μ λ©€λ²λ₯Ό νΈμΆνλ €λ©΄ λ²μ μ§μ μ°μ°μ(::)λ₯Ό μ¬μ©νλ©΄ λλ€.
πμ μΊμ€ν μ ν΅ν κΈ°λ³Έ ν΄λμ€μ ν¬μΈν° -> νμ ν΄λμ€ κ°μ²΄
μ μΊμ€ν μ ν΅ν΄ κΈ°λ³Έ ν΄λμ€μ ν¬μΈν°λ‘ νμ ν΄λμ€μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ κ²½μ° ν¨μλ₯Ό νΈμΆνλ€.
pCarλ κΈ°λ³Έ ν΄λμ€μ λν ν¬μΈν°μ΄λ―λ‘, κΈ°λ³Έ ν΄λμ€μ λ©€λ²μλ§ μ κ·Όν μ μλ€.
λ°λΌμ Speed()λ₯Ό νΈμΆνλ©΄, κΈ°λ³Έ ν΄λμ€ Carμ λ©€λ² Speed()κ° νΈμΆλλ€.