πŸ”₯μ½”λ”© κ·œμΉ™ : override 와 final

보물창고·2023λ…„ 1μ›” 25일
0

c++Intermediate μ½”λ“œλˆ„λ¦¬

λͺ©λ‘ 보기
25/62

μž¬μ •μ˜ κ·œμΉ™- 240305 μΆ”κ°€.

: 6λ²ˆμ€ c++11μ—μ„œ μ°Έμ‘°ν•œμ •μ‚¬κ°€ 좔가됨에 따라 μž¬μ •μ˜ κ·œμΉ™μ—λ„ μΆ”κ°€λ˜μ—ˆλ‹€κ³  함.

    1. 기반 클래슀 ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ virtual μ„ μ–Έλ˜μ–΄ μžˆμ–΄μ•Ό 함.
    1. κΈ°λ°˜ν•¨μˆ˜μ™€ νŒŒμƒν•¨μˆ˜μ˜ 이름이 λ°˜λ“œμ‹œ 동일해야 함.
      - μ†Œλ©ΈμžλŠ” μ œμ™Έ
    1. κΈ°λ°˜ν•¨μˆ˜μ™€ νŒŒμƒν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ ν˜•μ‹λ“€μ΄ λ°˜λ“œμ‹œ 동일해야 함.
    1. κΈ°λ°˜ν•¨μˆ˜μ™€ νŒŒμƒν•¨μˆ˜μ˜ const 성이 λ°˜λ“œμ‹œ 동일해야 함.
    1. κΈ°λ°˜ν•¨μˆ˜μ™€ νŒŒμƒν•¨μˆ˜μ˜ λ°˜ν™˜ν˜•μ‹κ³Ό μ˜ˆμ™Έ λͺ…μ„Έκ°€ λ°˜λ“œμ‹œ ν˜Έν™˜λ˜μ–΄μ•Ό 함.
    1. μ°Έμ‘° ν•œμ •μ‚¬λ“€μ‹œ λ°˜λ“œμ‹œ 동일해야 함.

μ»΄νŒŒμΌλŸ¬λŠ” μœ„μ˜ κ·œμΉ™μ— κ΄€ν•΄μ„œ μ•Œμ§€ λͺ»ν•¨.

  • μ˜ˆμ‹œμ½”λ“œ
    : μ§€κΈˆμ˜ κ²½μš°λŠ” Base 의 ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 숨기고 μžˆλŠ” κ±°μž„.
    -> μ»΄νŒŒμΌλŸ¬λŠ” μ•Œμ§€ λͺ»ν•œλ‹€....

  • μœ„μ˜ μ½”λ“œμ—μ„œ override ν‚€μ›Œλ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ©΄, μ»΄νŒŒμΌλŸ¬κ°€ μ–΄??? λ¬Έμ œκ°€ μžˆλŠ”λ°
    λΌλŠ” 것을 좜λ ₯함.

override ν‚€μ›Œλ“œ

: 가상 ν•¨μˆ˜ μž¬μ •μ˜ μ‹œ overrideλ₯Ό λΆ™μ—¬μ„œ μ•ˆμ „ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있게 함.
-> λ°©μ–΄ μ½”λ“œ
- μ΄νŽ™ν‹°λΈŒ λͺ¨λ˜ c++ ν•­λͺ© 12

μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 이유
: 기반 ν΄λž˜μŠ€μ— μžˆλŠ” 가상 ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μž¬μ •μ˜ν•΄μ•Ό ν•˜λŠ”λ°,
overrideλ₯Ό ν†΅ν•΄μ„œ μ‹œκ·Έλ‹ˆμ²˜κ°€ λ§žλŠ”μ§€λ₯Ό 확인할 수 μžˆλ‹€.

problem

  • μ•„λž˜μ˜ Derived ν΄λž˜μŠ€λŠ” Baseλ₯Ό 기반으둜 ν–ˆμ„λ•Œ, virtualν•œ μ˜λ„μ™€λŠ” λ‹€λ₯΄κ²Œ, λ™μΌν•œ ν•¨μˆ˜μ˜ 이름에 λ‹€λ₯Έ μΈμžμ‹œκ·Έλ‹ˆμ²˜λ“€μ„ μ‚¬μš©ν•¨..

    • κ²°κ³Ό
      : 컴파일 ν•˜λ©΄ μ—λŸ¬κ°€ μ—†μŒ...
    • 이유
      : 컴파일러 μž…μž₯μ—μ„œλŠ” Derivedμ—μ„œ μƒˆλ‘œμš΄ κ°€μƒν•¨μˆ˜λ₯Ό λ§Œλ“€μ—ˆλ‚˜λ³΄λ„€? μ΄λ ‡κ²Œ νŒλ‹¨ν•˜κΈ° λ•Œλ¬Έμž„.
  • Derived ν΄λž˜μŠ€μ—μ„œ f1,f2,f3,f4 ν•¨μˆ˜μ— overrideλ₯Ό μž‘μ„±ν•΄λ³΄μ•„λΌ..
    - override ν‚€μ›Œλ“œλ₯Ό 톡해 μž¬μ •μ˜ ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜ 검사λ₯Ό 함.


final

μ •μ˜

: κ°€μƒν•¨μˆ˜ μž¬μ •μ˜λ₯Ό λͺ»ν•˜κ²Œ ν•˜κ±°λ‚˜, νŒŒμƒν΄λž˜μŠ€λ₯Ό λ§Œλ“€ 수 μ—†κ²Œ 함.

μ‚¬μš©λ²•.

  • κ°€μƒν•¨μˆ˜ 뒀에 뢙이면
    : νŒŒμƒμ΄μ˜ κ°€μƒν•¨μˆ˜μ—μ„œλŠ” μž¬μ •μ˜ λΆˆκ°€ν•¨.

  • 클래슀 뒀에 뢙이면
    : νŒŒμƒ 클래슀λ₯Ό λ§Œλ“€ 수 μ—†μŒ.

μ–Έμ œ μ‚¬μš©ν• κΉŒ?

: νŒŒμƒ 클래슀 μͺ½μ—μ„œ 이제 λ”λŠ” λ‚˜λ§κ³  μž¬μ •μ˜ λͺ»ν•˜κ²Œ ν•  λ•Œ

problem

  • κ°€μƒν•¨μˆ˜ func을 가지고 μžˆλŠ” a클래슀λ₯Ό λ§Œλ“€μ–΄λΌ.

    • 1번) bλŠ” aλ₯Ό λ¬Όλ € λ°›κ³ , func 뒀에 final을 μž‘μ„±ν•˜λΌ.
      • cλŠ” bλ₯Ό λ¬Όλ € λ°›κ³  , funcλ₯Ό μž¬μ •μ˜ν•˜λΌ.
    • 2번) final 을 μ§€μš°κ³ , μ΄μ œλŠ” b 클래슀 뒀에 final을 μž‘μ„±ν•˜λΌ.
  • μ‹€ν–‰κ²°κ³Ό
    : mainμ—μ„œ 객체 μ‚¬μš©ν•˜μ§€λ„ μ•Šμ•˜λŠ”λ°, final둜 인해 컴파일 μ—λŸ¬ λ°œμƒν•˜λŠ” 것을
    확인할 수 μžˆλ‹€.

Quiz

  • 문제!!
#include <iostream>
using namespace std;

template<typename T> class Base
{
public:
	virtual void foo(const T a)
	{
		cout << "Base foo" << endl;
	}
};
class Derived : public Base<int*>
{
public:
	// 가상 ν•¨μˆ˜ fooλ₯Ό μž¬μ •μ˜ν•΄μ„œ
	// "Derived foo" 라고 좜λ ₯ν•΄ λ³΄μ„Έμš”.
	// override μ‚¬μš©ν•˜μ§€ 말고.
};

int main()
{
	Base<int*>* p = new Derived;
	p->foo(0);	// "Derived foo"
}
  • κ²°κ³Ό
    : const μ•ˆ λΆ™μ˜€λ”λ‹ˆ κ²°κ³Ό λ‚˜μ˜΄..

    • λ‚΄ 생각
      : μ•„λ¬΄λž˜λ„ const 와 template이 κ²°ν•©λ˜λ©΄μ„œ constκ°€ 제거 λ˜μ§€ μ•Šμ•˜μ„κΉŒ?
      생각이 듦.
      https://www.devoops.kr/80
profile
πŸ”₯πŸ”₯πŸ”₯

0개의 λŒ“κΈ€