C Programming Language/C++

C++ Inheritance(상속), 상속과 μ˜€λ²„λ‘œλ”©, ν…œν”Œλ¦Ώκ³Ό μƒμ†μ˜ 관계

567Rabbit 2024. 9. 1. 04:16

Inheritance(상속)

 

- C++μ—μ„œ μƒμ†μ˜ μš©μ–΄

 

base class (superclass : λΆ€λͺ¨ 클래슀)

derived class (subclass : μžμ‹ 클래슀)

 

 

ex)

 

Person이 base class 이고, studentκ°€ derived class이닀. μœ„μ—μ„œμ™€ 같이 ν‘œμ‹œν•˜λ©΄ 상속을 λ°›λŠ”λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

 

Personμ—μ„œ μ •μ˜ν•œ ν•¨μˆ˜λ“€μ„ Student ν΄λž˜μŠ€κ°€ ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 κ°€λŠ₯해진닀.

 

 

 

+ μƒμ†μ˜ νŠΉμ§• : μƒˆ λ©€λ²„μ˜ μΆ”κ°€

 

derived class(μžμ‹ 클래슀)λŠ” μžμ‹ λ§Œμ˜ μƒˆλ‘œμš΄ 멀버듀을 μ •μ˜ν•  수 μžˆλ‹€.

 

 

 

 


κ°€μ‹œμ„±(visibillity) 

 

 

 

(1) Public Inheritance

μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό public으둜 상속 (ex 맨 첫 μ˜ˆμ œμ—μ„œμ˜ class Student : public Person)

 

  • λΆ€λͺ¨ 클래슀의 public λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ public으둜 μœ μ§€λœλ‹€. μžμ‹ 클래슀의 객체λ₯Ό 톡해 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆλ‹€.
  • λΆ€λͺ¨ 클래슀의 protected λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ protected둜 μœ μ§€λœλ‹€. μžμ‹ 클래슀 λ‚΄λΆ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•˜μ§€λ§Œ, μ™ΈλΆ€μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€.
  • λΆ€λͺ¨ 클래슀의 private λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€. μžμ‹ 클래슀 λ‚΄λΆ€μ—μ„œλ„ 접근이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

 

Is-A 관계: Public 상속은 "Is-A" 관계λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 즉, Student ν΄λž˜μŠ€λŠ” Person 클래슀의 일쒅이라고 말할 수 μžˆλ‹€ 예λ₯Ό λ“€μ–΄, Student κ°μ²΄λŠ” Person 객체둜 취급될 수 μžˆλ‹€. (νŒŒμƒν΄λž˜μŠ€λŠ” 기본클래슀의 μ„œλΈŒνƒ€μž…μ΄λ©° Student ν΄λž˜μŠ€λŠ” Person ν΄λž˜μŠ€κ°€ μ‚¬μš©λ˜λŠ” μ–΄λŠ κ³³μ—μ„œλ„ μ‚¬μš©λ  수 μžˆλ‹€.) But, (Studentλ₯Ό Person으둜 닀루면 ν”„λ‘œκ·Έλž¨μ€ 컴파일 되고 μ‹€ν–‰λ˜μ§€λ§Œ, Student ν΄λž˜μŠ€μ—λ§Œ μžˆλŠ” 좔가적인 λ©€λ²„λŠ” μ‚¬μš©ν•  수 μ—†λ‹€. μ΄κ²ƒμ€ λ‹€ν˜•μ„±(polymorphism)의 νŠΉμ§• 쀑 ν•˜λ‚˜λ‘œ, μƒμœ„ 클래슀(κΈ°λ³Έ 클래슀)둜 λ‹€λ£° λ•ŒλŠ” μƒμœ„ ν΄λž˜μŠ€μ— μ •μ˜λœ λ©€λ²„λ§Œ μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€)

 

 

 

(2) Private Inheritance

μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό private으둜 상속 (ex 맨 첫 μ˜ˆμ œμ—μ„œμ˜ class Student : private Person)

 

  • λΆ€λͺ¨ 클래슀의 public λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ private으둜 λ³€ν™˜λœλ‹€. μžμ‹ 클래슀의 객체λ₯Ό 톡해 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€.
  • λΆ€λͺ¨ 클래슀의 protected 멀버도 μžμ‹ ν΄λž˜μŠ€μ—μ„œ private으둜 λ³€ν™˜λœλ‹€. μžμ‹ 클래슀 λ‚΄λΆ€μ—μ„œλŠ” μ ‘κ·Ό κ°€λŠ₯ν•˜μ§€λ§Œ, μ™ΈλΆ€μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€.
  • λΆ€λͺ¨ 클래슀의 private λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€. μžμ‹ 클래슀 λ‚΄λΆ€μ—μ„œλ„ 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

 

Has-A 관계: Private 상속은 "Has-A" κ΄€κ³„λ‘œ λ³Ό 수 μžˆλ‹€. 즉, StudentλŠ” Person을 ν¬ν•¨ν•˜κ³  μžˆμ§€λ§Œ, Studentκ°€ Personμ΄λΌλŠ” μ˜λ―ΈλŠ” μ•„λ‹ˆλ‹€

 

 

 

(3) Private Inheritance

μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό protected둜 상속 (ex 맨 첫 μ˜ˆμ œμ—μ„œμ˜ class Student : protected Person)

 

  • λΆ€λͺ¨ 클래슀의 public λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ protected둜 λ³€ν™˜λœλ‹€. μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†κ³ , μžμ‹ 클래슀 및 κ·Έ νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
  • λΆ€λͺ¨ 클래슀의 protected 멀버도 μžμ‹ ν΄λž˜μŠ€μ—μ„œ protected둜 μœ μ§€λœλ‹€. μžμ‹ 클래슀 및 κ·Έ νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
  • λΆ€λͺ¨ 클래슀의 private λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€. μžμ‹ 클래슀 λ‚΄λΆ€μ—μ„œλ„ 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.

 

Is-Implemented-In-Terms-Of 관계: Protected 상속은 일반적으둜 "Is-Implemented-In-Terms-Of" κ΄€κ³„λ‘œ 이해할 수 μžˆλ‹€. 즉, StudentλŠ” λ‚΄λΆ€μ μœΌλ‘œ Person의 κΈ°λŠ₯을 μ‚¬μš©ν•΄ κ΅¬ν˜„λ˜μ§€λ§Œ, μ™ΈλΆ€μ—μ„œ 보기에 StudentλŠ” Person이 μ•„λ‹ˆλ‹€

 

 

 

 

 

Inheritance(상속)κ³Ό Overloading(μ˜€λ²„λ‘œλ”©)

  • μ˜€λ²„λ‘œλ”©μ€ λ™μΌν•œ 클래슀 λ‚΄μ—μ„œ 이루어짐. 즉, 같은 μ΄λ¦„μ˜ μ—¬λŸ¬ ν•¨μˆ˜κ°€ 같은 ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄ μžˆμ„ λ•Œ, 각 ν•¨μˆ˜μ˜ μ‹œκ·Έλ‹ˆμ²˜(λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…κ³Ό 개수)κ°€ λ‹€λ₯΄λ©΄, C++ μ»΄νŒŒμΌλŸ¬λŠ” 이λ₯Ό κ΅¬λ³„ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.
  • κ·ΈλŸ¬λ‚˜, μƒμ†λœ 멀버 ν•¨μˆ˜μ— λŒ€ν•΄ μ˜€λ²„λ‘œλ”©μ„ μ‹œλ„ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€. νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ 클래슀의 ν•¨μˆ˜ 이름을 λ™μΌν•˜κ²Œ μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ ν•¨μˆ˜(μ˜€λ²„λ‘œλ”©)λ₯Ό μ •μ˜ν•  λ•Œ, κΈ°λ³Έ ν΄λž˜μŠ€μ— μžˆλŠ” λ™μΌν•œ μ΄λ¦„μ˜ ν•¨μˆ˜λ“€μ€ νŒŒμƒ 클래슀의 λ²”μœ„μ—μ„œ κ°€λ €μ§ˆ 수 μžˆλ‹€.

 

=> μ•„λž˜μ™€ 같이 상속 클래슀 μ˜ˆμ‹œμ—μ„œ  μƒμ†λœ 멀버 ν•¨μˆ˜μ— λŒ€ν•œ μ˜€λ²„λ‘œλ”©μ΄ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€

class Base {
public:
    void foo(int x) { 
        std::cout << "Base::foo(int)" << std::endl; 
    }
};

class Derived : public Base {
public:
    void foo(double x) {
        std::cout << "Derived::foo(double)" << std::endl; 
    }
};

 

 

μ˜€λ²„λ‘œλ”©μ΄ 적용되렀면??

 

- λ§Œμ•½ μƒμ†λœ 멀버 ν•¨μˆ˜λ“€κ³Ό ν•¨κ»˜ μ˜€λ²„λ‘œλ”©μ„ μ œλŒ€λ‘œ μ μš©ν•˜κ³  μ‹Άλ‹€λ©΄, κΈ°λ³Έ 클래슀의 ν•¨μˆ˜λ₯Ό νŒŒμƒ 클래슀의 λ²”μœ„λ‘œ 가져와야 ν•œλ‹€. 이λ₯Ό μœ„ν•΄ ***using ν‚€μ›Œλ“œ***λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

class Derived : public Base {
public:
    using Base::foo;  // Base 클래슀의 foo(int)λ₯Ό κ°€μ Έμ˜΄

    void foo(double x) {
        std::cout << "Derived::foo(double)" << std::endl; 
    }
};

 

μ΄λ ‡κ²Œ ν•˜λ©΄, Derived ν΄λž˜μŠ€μ—μ„œ foo(int)와 foo(double) λͺ¨λ‘ μ˜€λ²„λ‘œλ”©λ˜μ–΄ μ‚¬μš©λ  수 μžˆλ‹€.

 

 

 

 

 

ν…œν”Œλ¦Ώκ³Ό 상속 (Class Template : Inheritance)

클래슀 ν…œν”Œλ¦Ώμ΄λ‚˜ ν΄λž˜μŠ€λŠ” μ„œλ‘œ μ–΄λ–€ μ‘°ν•©μœΌλ‘œλ“  상속됨

 

클래슀 ν…œν”Œλ¦Ώμ„ 상속 받을 λ•Œ μ œμ•½μ΄ 있음

- νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ 클래슀의 멀버 ν•¨μˆ˜λ‚˜ 멀버 λ³€μˆ˜λŠ” μžλ™μœΌλ‘œ μ΄μš©ν•  수 μ—†μŒ

- μ„Έ 가지 해결책이 있음

  1) this ν¬μΈν„°λ‘œ 멀버 ν•¨μˆ˜ ν˜ΈμΆœμ„ ν•œμ •ν•˜κΈ°           ex) this -> Func() ;

  2) using으둜 멀버 ν•¨μˆ˜ 지정                                   ex) using base<T>::Func ;

  3) κΈ°λ³Έ 클래슀의 멀버 ν•¨μˆ˜λ₯Ό 직접 호좜                 ex) Foo<T>::Func() ;