usingμ μ¬μ©νμ¬ μ κ·Ό λ€μ μ μνκΈ°
protected νμμ΄λ private νμμ μ¬μ©ν λ, κΈ°μ΄ ν΄λμ€μ public λ©€λ²λ€μ protected λ©€λ² λλ private λ©€λ²κ° λλ€. μ΄λ€ νΉμ κΈ°μ΄ ν΄λμ€ λ©μλλ₯Ό νμ ν΄λμ€μμ publicμΌλ‘ μ¬μ©νκ³ μΆλ€κ³ κ°μ νμ.
ν κ°μ§ λ°©λ²μ, κΈ°μ΄ ν΄λμ€ λ©μλλ₯Ό μ¬μ©νλ νμ ν΄λμ€ λ©μλλ₯Ό μ μνλ κ²μ΄λ€.
double Student::Sum() const // Studentλ κΈ°μ΄ ν΄λμ€, sum()μ valarray λ©μλ
{return std::valarray<double>::sum();}
νλμ ν¨μ νΈμΆμ λ€λ₯Έ ν¨μ μμ λ£μ μ μλ λ€λ₯Έ λ°©λκ° μλ€. using μ μΈμ μ¬μ©νμ¬ νμ ν΄λμ€μμ μ¬μ©ν νΉμ κΈ°μ΄ ν΄λμ€ λ©€λ²λ₯Ό μ§μ νλ κ²μ΄λ€. valarray ν΄λμ€μ min()κ³Ό max()λ©μλλ₯Ό Student ν΄λμ€μ ν¨κ» μ¬μ©νκ³ μΆλ€λ©΄ ν€λ νμΌμ public λΆλΆμ using μ μΈ μΆκ° κ°λ₯
class Student: private std::valarray<double>
{
...
public:
using std::valarray<double>::min;
using std::valarray<double>::max;
...
}
μ΄ μ μΈμ valarray<double>::min()κ³Ό valarray<double>::max() λ©μλλ₯Ό λ§μΉ publicμ Student λ©μλμΈ κ²μ²λΌ μ¬μ©ν μ μκ² λ§λ λ€.
using μ μΈμ μκ΄νΈ, ν¨μ μκ·Έλ΄μ², 리ν΄ν μμ΄ λ©€λ² μ΄λ¦λ§ μ¬μ©νλ€.
λ νκ°μ§ λ°©λ²μ, privateλ‘ νμλ ν΄λμ€μ κΈ°μ΄ ν΄λμ€ λ©μλλ€μ λ€μ μ μΈνλ κ²μ΄λ€.
class Student: private std::valarray<double>
{
public:
std::valarray<double>::operator[];
...
};
λ€μ€ μμ
λ€μ€ μμμ μ§κ³ μΈμ ν κΈ°μ΄ ν΄λμ€λ₯Ό νλ μ΄μ κ°μ§λ ν΄λμ€λ₯Ό μμ νλ€. public λ€μ€ μμμ is-a κ΄κ³λ₯Ό λνλ΄μΌ νλ€. μλ₯Ό λ€μ΄, Waiter ν΄λμ€μ Singer ν΄λμ€κ° μλ€λ©΄, κ·Έ λ ν΄λμ€λ‘λΆν° SingingWaiter ν΄λμ€λ₯Ό νμμν¬ μ μλ€. class SingingWaiter : public Waiter, public Singer {...}; ν€μλ publicμΌλ‘ κΈ°μ΄ ν΄λμ€λ€μ μ ννμ§ μμΌλ©΄ μ»΄νμΌλ¬κ° private νμμΌλ‘ κ°μ£Όνλ€.
κ°μ κΈ°μ΄ ν΄λμ€
κ°μ κΈ°μ΄ ν΄λμ€λ, νλμ κ³΅ν΅ μ‘°μμ 곡μ νλ μ¬λ¬ κ°μ κΈ°μ΄ ν΄λμ€λ‘λΆν° κ³΅ν΅ μ‘°μμ μ μΌ κ°μ²΄λ₯Ό μμνλ λ°©μμΌλ‘ κ°μ²΄λ₯Ό νμμν€λ κ²μ νμ©νλ€.
ν΄λμ€ μ μΈμ ν€μλ virtualμ μ¬μ©νμ¬ Workerλ₯Ό κ°μ κΈ°μ΄ ν΄λμ€λ‘ λ§λ λ€.
class Singer: virtual public Worker{...};
class Waiter: public virtual Worker{...};
class SingingWaiter: public Singer,public Waiter {...};
SingingWaiter κ°μ²΄λ Worker κ°μ²΄μ 볡μ¬λ³Έμ νλλ§ λ΄ν¬νλ€.
-μλ‘μ΄ μμ±μ κ·μΉ
λ€μκ³Ό κ°μ μμ±μκ° μλ€κ³ κ°μ ν΄λ³΄μ
SingingWaiter(const Worker &wk, int p=0,int v=Singer::other)
:Waiter(wk,p), Singer(wk,v) //κ²°ν¨μ΄ μλ€.
μ 보μ μλ μ λ¬μ μν΄ wkκ° Waiterμ Singerλ₯Ό κ±°μ³ Workerκ°μ²΄μ μ λ¬λλ€. κ·Έλ¬λ―λ‘ κΈ°μ΄ ν΄λμ€κ° κ°μμΌ κ²½μ°μ C++λ μ€κ° ν΄λμ€λ₯Ό ν΅ν΄ κΈ°μ΄ ν΄λμ€μ μλμΌλ‘ μ 보λ₯Ό μ λ¬νλ κΈ°λ₯μ μ μ§μν¨λ€. κ·Έλ¬λ μ»΄νμΌλ¬λ νμ κ°μ²΄λ€μ μμ±νκΈ° μ μ κΈ°μ΄ κ°μ²΄ μ±λΆμ μμ±ν΄μΌ νλ€. μ΄ κ²½μ°, λν΄νΈ Worker μμ±μλ₯Ό μ¬μ©ν κ²μ΄λ€.
κ°μ κΈ°μ΄ ν΄λμ€λ₯Ό μν΄ λν΄νΈ μμ±μκ° μλ κ²μ μ¬μ©νκ³ μΆλ€λ©΄, μ μ ν κΈ°μ΄ μμ±μλ₯Ό λͺ μμ μΌλ‘ νΈμΆν΄μΌ νλ€.
SingingWaiter(const Worker &wk,int p=0,int v=Singer::other)
:Worker(wk),Waiter(wk,p), Singer(wk,v) {}
μ΄λ λ©μλλ₯Ό μ¬μ©νλκ°?
Show()λ©μλμ μ λ²μ μ μλ΅νκ³ , SingingWaiter κ°μ²΄λ₯Ό μ¬μ©νμ¬ μμλ°μ Show() λ©μλλ₯Ό νΈμΆνλ€κ³ κ°μ ν΄λ³΄μ.
SingingWaiter newhire("Madonna",2005.6,soprano);
newhire.Show(); //λͺ¨νΈνλ€.
λ¨μΌ μμμμλ Show()λ₯Ό λ€μ μ μνμ§ μμΌλ©΄ κ°μ₯ κ°κΉμ΄ μ‘°μμ μ μκ° μ¬μ©λλ€. νμ§λ§ μ΄ κ²½μ°, μ§κ³μ μΈμ ν μ‘°μμ΄ Show() ν¨μλ₯Ό κ°κ° νλμ© κ°μ§κ³ μλ€.
μ¬μ© λ²μ κ²°μ μ°μ°μλ₯Ό μ¬μ©νλ©΄ νμ€νκ² ν μ μλ€.
newhire.Singer::Show();
κ·Έλ¬λ λ λμ λ°©λ²μ SingingWaiterμ λν΄ Show()λ₯Ό λ€μ μ μνκ³ , μ¬μ©ν Show() λ²μ μ μ§μ νλ κ²μ΄λ€.
void SingingWaiter::Show()
{
Singer::Show();
}
νμ§λ§ μ΄ λ°©μμ Waiter μ±λΆμ 무μνκΈ° λλ¬Έμ μ€ν¨νλ€. Waiter λ²μ λ ν¨κ» νΈμΆν¨μΌλ‘μ¨ ν΄κ²°ν μλ μλ€.
κ·Έλ¬λ, Worker::Show()λ₯Ό λ λ² νΈμΆνκΈ° λλ¬Έμ μ΄λ¬ν μ μΈ΅μ μ κ·Ό λ°©μ λμ μ λͺ¨λ μ κ·Ό λ°©μμ μ¬μ©ν΄μΌ νλ€.
μ¦ Worker μ±λΆλ§ μΆλ ₯νλ λ©μλ, Waiter μ±λΆλ§ μΆλ ₯νλ λ©μλ, Singer μ±λΆλ§ μΆλ ₯νλ λ©μλλ₯Ό κ°κ° λ°λ‘ μ 곡ν ν SingingWaiter::Show() λ©μλμμ κ·Έ μ±λΆλ€μ κ²°ν©νλ€.
-κ°μ κΈ°μ΄ ν΄λμ€μ κ°μμ΄ μλ κΈ°μ΄ ν΄λμ€μ νΌν©
ν΄λμ€ Bκ° ν΄λμ€ Cμ Dμ λν΄μ κ°μ κΈ°μ΄ ν΄λμ€μ΄κ³ , ν΄λμ€ Xμ Tμ λν΄μλ κ°μ κΈ°μ΄ ν΄λμ€κ° μλλΌκ³ κ°μ νμ. κ·Έλ°λ° ν΄λμ€ Mμ ν΄λμ€ C, D, X, Yλ‘λΆν° νμμν¨λ€κ³ κ°μ νμ. μ΄λ¬ν κ²½μ° ν΄λμ€ Mμ ν΄λμ€ Cμ Dμ λν΄ ν΄λμ€ Bμ μ’ μ κ°μ²΄λ₯Ό νλλ§ λ΄ν¬νλ€. κ·Έλ¦¬κ³ ν΄λμ€ Xμ Yμ λν΄μλ κ°κ° λ³κ°μ ν΄λμ€ B μ’ μ κ°μ²΄λ€μ λ΄ν¬νλ€. κ²°κ³Όμ μΌλ‘ 3κ°μ ν΄λμ€ B μ’ μ κ°μ²΄λ₯Ό λ΄ν¬νκ² λλ€.
-κ°μ κΈ°μ΄ ν΄λμ€μ κΈ°μ΄ μ°μ
νμ ν΄λμ€μ μλ μ΄λ¦μ μ§μ μ΄λ κ°μ μ΄λ κ°μ μ‘°μ ν΄λμ€μ μλ λμΌν μ΄λ¦λ³΄λ€ λΉκ΅μ°μλ₯Ό κ°μ§λ€