hugDog
Android DevLog
hugDog
전체 방문자
였늘
μ–΄μ œ
  • πŸ™Œ Hello? (162)
    • πŸ§©μ•ˆλ“œλ‘œμ΄λ“œ (12)
      • κ°œλ… 정리 (5)
      • 버그 ν•΄κ²° (4)
      • 기타 (3)
    • πŸ”μ•Œκ³ λ¦¬μ¦˜ (54)
      • κ°œλ… (0)
      • λ°±μ€€ (48)
      • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (6)
    • πŸ“„κ°œλ°œ 일지 (0)
      • FINPO (0)
    • πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ (71)
      • C++ 정리 (49)
      • C++κΈ°μ΄ˆν”ŒλŸ¬μŠ€ μ—°μŠ΅λ¬Έμ œ (20)
      • Kotlin (2)
    • ⭐Project (1)
    • 🚴TIL (13)
      • Clean Code (13)
    • πŸš©κΈ°νƒ€ (9)
      • λͺ©ν‘œ (6)
      • 일상 (3)
      • λ¬Έμ„œ (0)

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
hugDog

Android DevLog

πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리

C++ 정리 - 39 (using을 μ‚¬μš©ν•˜μ—¬ μ ‘κ·Ό λ‹€μ‹œ μ •μ˜ν•˜κΈ°, 닀쀑 상속, 가상 기초 ν΄λž˜μŠ€μ™€ 가상이 μ•„λ‹Œ 기초 클래슀의 ν˜Όν•©, 가상 기초 ν΄λž˜μŠ€μ™€ 기초 μš°μœ„)

2020. 11. 21. 18:23
728x90

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 쒅속 객체λ₯Ό λ‚΄ν¬ν•˜κ²Œ λœλ‹€.

 

-가상 기초 ν΄λž˜μŠ€μ™€ 기초 μš°μœ„

νŒŒμƒ ν΄λž˜μŠ€μ— μžˆλŠ” 이름은 직접이든 간접이든 간에 쑰상 ν΄λž˜μŠ€μ— μžˆλŠ” λ™μΌν•œ 이름보닀 λΉ„κ΅μš°μœ„λ₯Ό κ°€μ§„λ‹€

 

 

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬
    'πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • C++ 정리 - 41 (ν…œν”Œλ¦Ώ ꡬ체화, 멀버 ν…œν”Œλ¦Ώ, λ§€κ°œλ³€μˆ˜ ν…œν”Œλ¦Ώ, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ™€ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ λ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ μ–Έλ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ..
    • C++ 정리 - 40 (닀쀑 상속 μš”μ•½, 클래슀 ν…œν”Œλ¦Ώ, ν¬μΈν„°λ“€μ˜ μŠ€νƒμ„ λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜λŠ” 경우)
    • C++ 정리 - 38 (valarray 클래슀: 훑어보기, μ΄ˆκΈ°ν™” μˆœμ„œ, private 상속, 기초 클래슀 λ©”μ„œλ“œμ— μ ‘κ·Όν•˜κΈ°, 기초 클래슀 객체에 μ ‘κ·Όν•˜κΈ°, 기초 클래슀 ν”„λ Œλ“œμ— μ ‘κ·Όν•˜κΈ°, μ»¨ν…ŒμΈλ¨ΌνŠΈμ™€ private 상속)
    • C++ 정리 - 37 (λŒ€μž… μ—°μ‚°μž κ΄€λ ¨ 사항, private 멀버와 protected 멀버, 가상 λ©”μ„œλ“œ, ν”„λ Œλ“œ κ΄€λ ¨ 사항, 기초 클래슀 λ©”μ„œλ“œμ˜ μ‚¬μš©)
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”