κ°μ²΄μ§ν₯μ νΉμ± μ€ λ€νμ±μ κ°λ μ μ μ©ν κ²μ΄λ€.
λ€νμ±μ κ°κ°μ κ°μ²΄λ₯Ό ꡬλΆνκΈ° μν΄ ν¨μμ μ°κΈ°λ νμ§λ§ μλ©Έμμλ μ¬μ©λλ€.
ν΄λμ€ λ΄ μλ©Έμμλ μ virtual ν€μλκ° λΆμκΉ?
λ¨Όμ , μμμλ 3κ°μ§ κ΄κ³κ° μ‘΄μ¬νλ€.
- is-a: λ°μ΄ν° νμ λΆλͺ¨ ν΄λμ€λ‘ μ μΈνκ³ μμ±μ μμ ν΄λμ€λ‘ ν λΉνλ€.
- λΆλͺ¨ ν΄λμ€μ λ³μμ ν¨μλ§ νΈμΆν μ μλ€.
- λ§μ½, μμ ν΄λμ€μ Override ν ν¨μκ° μ‘΄μ¬νλ€λ©΄ κ·Έ ν¨μλ νΈμΆ κ°λ₯νλ€.
- has-a: μμ κ΄κ³λ‘μ λ€λ₯Έ κ°μ²΄λ₯Ό ν¬ν¨νμ¬ κ·Έ κ°μ²΄μ κΈ°λ₯(λ³μ, ν¨μ)μ μ¬μ©νλ€.
- μμ± μ μμλ°μ λΆλͺ¨ ν΄λμ€λΆν° νΈμΆνκ³ μλ©Έ μ μμ ν΄λμ€λΆν° νΈμΆλλ€.
- is implemented of
#include <iostream>
using namespace std;
class Has {
public:
Has() {
cout << "Has μμ±μ" << endl;
}
~Has() {
cout << "Has μλ©Έμ" << endl;
}
};
class Base {
private:
Has* h; // has-a μμ
public:
Base() {
h = new Has();
cout << "Base μμ±μ" << endl;
}
~Base() {
delete h;
cout << "Base μλ©Έμ" << endl;
}
};
class Derived : public Base {
public:
Derived() {
cout << "Derived μμ±μ" << endl;
}
~Derived() {
cout << "Derived μλ©Έμ" << endl;
}
};
int main()
{
Base* b1 = new Base();
Base* b2 = new Derived(); // is-a μμ
//Derived* d = new Base(); μ€νλμ§ μλλ€.
delete b1;
delete b2;
}
// μΆλ ₯
// Has μμ±μ // b1
// Base μμ±μ // b1
// Has μμ±μ // b2
// Base μμ±μ // b2
// Derived μμ±μ // b2
// Has μλ©Έμ // b1
// Base μλ©Έμ // b1
// Has μλ©Έμ // b2
// Base μλ©Έμ // b2
is-aμ μ£Όλͺ©νμ
μμ±ν λλ Base, Derivedμ μμ±μλ₯Ό λͺ¨λ νΈμΆνμ§λ§ μλ©Έν λλ Baseμ μλ©Έμλ§ νΈμΆλλ€. μ΄λ¬ν λ¬Έμ λ λ©λͺ¨λ¦¬ λμμ μμΈμ΄ λλ€.
μ κΉ, b1, b2 κ°μ²΄λ μ λ λ€ Base* λ°μ΄ν° νμΌλ‘ λ°μκΉ?
μ΄λ€ ν¨μ λ΄μμ μΈμλ‘ μ λ ₯λ°μ κ°μ²΄κ° μ΄λ ν΄λμ€μ κ°μ²΄μΈμ§ λͺ¨λ₯Έλ€λ©΄ λΆλͺ¨ ν΄λμ€λ‘ μ μΈνλ κ² μ’λ€. μΈμλ₯Ό λΆλͺ¨ ν΄λμ€λ‘ λ°μ§ μλλ€λ©΄ if λ¬ΈμΌλ‘ λͺ¨λ κ°μ²΄λ₯Ό ꡬλΆν΄μΌ νλ€.
#include <iostream>
using namespace std;
class Base {
public:
Base() {
cout << "Base μμ±μ" << endl;
}
virtual ~Base() {
cout << "Base μλ©Έμ" << endl;
}
};
class Derived : public Base {
public:
Derived() {
cout << "Derived μμ±μ" << endl;
}
virtual ~Derived() {
cout << "Derived μλ©Έμ" << endl;
}
};
int main()
{
Base* b1 = new Base();
Base* b2 = new Derived();
delete b1;
delete b2;
}
// μΆλ ₯
// Base μμ±μ // b1
// Base μμ±μ // b2
// Derived μμ±μ // b2
// Base μλ©Έμ // b1
// Derived μλ©Έμ // b2
// Base μλ©Έμ //b2
μλ©Έμμ virtual ν€μλλ₯Ό μΆκ°νλ μ μμ μΌλ‘ νΈμΆλλ€!