C++ Inheritance(μμ), μμκ³Ό μ€λ²λ‘λ© (using ν€μλ)
Inheritance(μμ) - C++μμ μμμ μ©μ΄ base class (superclass : λΆλͺ¨ ν΄λμ€)derived class (subclass : μμ ν΄λμ€) ex) Personμ΄ base class μ΄κ³ , studentκ° derived classμ΄λ€. μμμμ κ°μ΄ νμνλ©΄ μμμ λ°λ
codebunny99.tistory.com
μ μΊμ€ν (Upcasting)μ΄λ?
μ μΊμ€ν (Upcasting)μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP)μμ νμ ν΄λμ€(μμ ν΄λμ€)μ κ°μ²΄λ₯Ό κΈ°λ³Έ ν΄λμ€(λΆλͺ¨ ν΄λμ€) νμ μΌλ‘ λ³ννλ κ²μ μλ―Ένλ€. μ΄ λ³νμ μμμ μΌλ‘(λͺ μμ μΈ μΊμ€ν μ°μ° μμ΄) μ΄λ£¨μ΄μ§λ©°, μμ κ΄κ³μ μλ ν΄λμ€λ€ μ¬μ΄μμ μμ£Ό μ¬μ©λλ€.
μ μΊμ€ν μ νΉμ§:
Is-A κ΄κ³:
- μ μΊμ€ν μ "Is-A" κ΄κ³μ κΈ°λ°νλ€. μ¦, νμ ν΄λμ€λ κΈ°λ³Έ ν΄λμ€μ μΌμ’ μ΄κΈ° λλ¬Έμ, νμ ν΄λμ€ κ°μ²΄λ₯Ό κΈ°λ³Έ ν΄λμ€ νμ μΌλ‘ λ€λ£¨λ κ²μ΄ κ°λ₯νλ€.
- μλ₯Ό λ€μ΄, Studentλ Personμ μΌμ’ μ΄λ―λ‘, Student κ°μ²΄λ₯Ό Person νμ μΌλ‘ μ μΊμ€ν ν μ μλ€.
μμμ λ³ν:
C++μμλ νμ ν΄λμ€μ κ°μ²΄λ₯Ό κΈ°λ³Έ ν΄λμ€μ κ°μ²΄λ‘ λ€λ£° λ, λ³λμ μΊμ€ν μ°μ°μ μμ΄ μλμΌλ‘ μ μΊμ€ν μ΄ κ°λ₯νλ€. μ΄ κ³Όμ μμ μ»΄νμΌλ¬λ νμ ν΄λμ€ κ°μ²΄λ₯Ό κΈ°λ³Έ ν΄λμ€ κ°μ²΄λ‘ μ²λ¦¬ν¨
κΈ°λ³Έ ν΄λμ€ λ©€λ²μλ§ μ κ·Ό κ°λ₯:
μ μΊμ€ν λ κ°μ²΄λ κΈ°λ³Έ ν΄λμ€μ λ©€λ²μλ§ μ κ·Όν μ μλ€. νμ ν΄λμ€μμ μΆκ°λκ±°λ μ¬μ μλ λ©€λ² ν¨μλ λ³μμλ μ κ·Όν μ μλ€.
class Person {
public:
ββββvoid introduce() {
ββββββββstd::cout << "I am a person." << std::endl;
ββββ}
};
class Student : public Person {
public:
ββββvoid introduce() {
ββββββββstd::cout << "I am a student." << std::endl;
ββββ}
ββββvoid study() {
ββββββββstd::cout << "I am studying." << std::endl;
ββββ}
};
int main() {
ββββStudent s; // Student κ°μ²΄ μμ±
ββββPerson* p = &s; // Student κ°μ²΄λ₯Ό Person ν¬μΈν°λ‘ μ
μΊμ€ν
ββββp->introduce(); // "I am a person." νΈμΆ (Person ν΄λμ€μ introduce νΈμΆ)
ββββ// p->study(); // μ€λ₯! Person ν΄λμ€μλ study() ν¨μκ° μμ
ββββreturn 0;
}
- Person* p = &s;:
- Student κ°μ²΄ sλ₯Ό Person νμ ν¬μΈν° pλ‘ μ μΊμ€ν . μ΄λ λ³λμ μΊμ€ν μ°μ°μκ° νμνμ§ μλ€.
- p->introduce();:
- pλ Person νμ μ ν¬μΈν°μ΄κΈ° λλ¬Έμ, introduce() νΈμΆ μ Person ν΄λμ€μ μ μλ introduce() ν¨μκ° νΈμΆλ¨
- λ€νμ±(polymorphism)μ μ§μνλ κ°μ ν¨μ(virtual function)κ° μλ κ²½μ°, κΈ°λ³Έ ν΄λμ€μ ν¨μκ° νΈμΆ
- p->study();:
- μ΄ μ½λλ μ»΄νμΌ μ€λ₯λ₯Ό μΌμΌν΄. pλ Person νμ μ ν¬μΈν°μ΄κΈ° λλ¬Έμ Person ν΄λμ€μ μ μλμ§ μμ study() ν¨μμλ μ κ·Όν μ μλ€.
μ μΊμ€ν μ νμ©:
- λ€νμ±(Polymorphism): μ μΊμ€ν μ λ€νμ±μ κΈ°μ΄λ₯Ό μ 곡νλ€. κΈ°λ³Έ ν΄λμ€μ ν¬μΈν°λ μ°Έμ‘°λ₯Ό μ¬μ©ν΄ νμ ν΄λμ€ κ°μ²΄λ₯Ό μ²λ¦¬νλ©΄, λμ€μ λ°νμ μμ μ νν νμ ν΄λμ€μ κ°μ²΄κ° μ΄λ€ κ²μΈμ§λ₯Ό μ μ μκ² λλ€.
- μ½λμ μ μ°μ±: μ½λκ° λ μ μ°ν΄μ§κ³ μ¬μ¬μ©μ±μ΄ λμμ§λ€. λ€μν νμ ν΄λμ€λ₯Ό κ°μ κΈ°λ³Έ ν΄λμ€ νμ μΌλ‘ μ²λ¦¬ν μ μκΈ° λλ¬Έμ, ν¨μλ λ©μλλ₯Ό μμ±ν λ λ€μν νμ μ κ°μ²΄λ₯Ό λ€λ£° μ μλ€.
μ μΊμ€ν μ νκ³:
- μΆκ°λ λ©€λ²μ λν μ κ·Ό μ ν: μ μΊμ€ν λ κ°μ²΄λ κΈ°λ³Έ ν΄λμ€μ μ μλ λ©€λ²μλ§ μ κ·Όν μ μμΌλ©°, νμ ν΄λμ€μ μΆκ°λ λ©€λ²(λ³μ, ν¨μ)μλ μ κ·Όν μ μλ€.
- λ€νμ± λ―Έμ μ©: κ°μ ν¨μκ° μλ λ©€λ² ν¨μμ κ²½μ°, κΈ°λ³Έ ν΄λμ€μ ν¨μκ° νΈμΆλλ©°, νμ ν΄λμ€μμ μ¬μ μλ ν¨μλ νΈμΆλμ§ μλλ€.
λ€νμ± (Polymorphism)
λ€νμ±μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP)μ ν΅μ¬ κ°λ μ€ νλλ‘, κ°μ μ΄λ¦μ ν¨μκ° κ°μ²΄μ νμ μ λ°λΌ λ€λ₯΄κ² λμνλ κ²μ μλ―Ένλ€.

λ€νμ±μ΄λ νΉμ ν ν¨μ(μ: getArea())λ₯Ό νΈμΆν λ, κ·Έ ν¨μκ° νΈμΆλ κ°μ²΄μ νμ μ λ°λΌ μλ‘ λ€λ₯Έ ν¨μκ° μ€νλλ κ²μ μλ―Ένλ€. μλ₯Ό λ€μ΄, getArea()λΌλ λμΌν μ΄λ¦μ ν¨μκ° Triangle(μΌκ°ν), Rectangle(μ¬κ°ν), Circle(μ) κ°μ²΄μμ κ°κ° λ€λ₯΄κ² ꡬνλ μ μλ€λ κ²μ ν΅ν΄ λ€νμ±μ μ€λͺ ν μ μλ€.
λ€νμ±μ νΉμ§
- λμ λ°μΈλ©: λ€νμ±μμλ μ€μ νΈμΆλλ ν¨μκ° λ°νμ(νλ‘κ·Έλ¨μ΄ μ€νλλ λμ)μ κ²°μ λλ€. μ΄λ₯Ό λμ λ°μΈλ©(dynamic binding)μ΄λΌκ³ νλ€. λμ λ°μΈλ©μ΄λ μ€ν μ€ κΈ°λ³Έν΄λμ€μ μ°Έμ‘°λ ν¬μΈν°λ‘ κ°μ ν¨μκ° νΈμΆλλ©΄, νμ ν΄λμ€ κ°μ²΄μ μ€λ²λΌμ΄λ©λ κ°μ ν¨μλ₯Ό λμ μΌλ‘ μ°Ύμμ νΈμΆνλ κ²μ λ§νλ€.
- μ½λμ μ μ°μ±: λ€νμ±μ κ°μ μΈν°νμ΄μ€(ν¨μ μ΄λ¦)λ₯Ό ν΅ν΄ λ€μν κ°μ²΄λ₯Ό λ€λ£° μ μκ² ν΄μ€λ€. μ΄λ‘ μΈν΄ μ½λκ° λ μ μ°ν΄μ§κ³ μ μ§λ³΄μκ° μ¬μμ§λ€
- λ€νμ±μ νμ©: λ€μν ννμ κ°μ²΄κ° μμ λ, λμΌν λ°©μμΌλ‘ λ€λ£° μ μλ€. μλ₯Ό λ€μ΄, λν ν΄λμ€μ λ°°μ΄μμ κ°κ°μ λν λ©΄μ μ κ³μ°ν λ, λνμ νμ μ λ°λΌ μ μ ν getArea() ν¨μκ° νΈμΆλλ€.

λ€μκ³Ό κ°μ΄ νΈμΆλλ κ²μ΄ λ€νμ±μ μ₯μ μ΄λ€.
<μ°Έκ³ >
λ€νμ± ν΄λμ€(Polymorphism)λ νλ μ΄μμ κ°μ ν¨μλ₯Ό ν¬ν¨νλ ν΄λμ€λ₯Ό λ§νλ€.
λ€μ€ μμ(Multiple Inheritance) : λ€μ΄μλͺ¬λ νν


λ ν΄λμ€ λͺ¨λ κ°μ print() ν¨μκ° μλ€λ©΄, λΆλͺ¨ ν΄λμ€ μ€ μ΄λ μͺ½μ ν¨μλ₯Ό μΈ κ²μΈμ§ μ νν νννμ¬μΌ μλ¬κ° λμ§ μλλ€. μλ¬κ° λμ§ μκΈ° μν΄μ Student::print();, Teacher::print(); μ²λΌ λͺ μν΄μ£Όμ΄μΌ νλ€.

κ°μ κΈ°λ³Έ ν΄λμ€(Virtual Base Class)μ κ°μ μμ(Virtual Inheritance)
λ€μ΄μλͺ¬λ μμ λ¬Έμ (Diamond Problem)μ μ΄λ₯Ό ν΄κ²°νκΈ° μν κ°μ κΈ°λ³Έ ν΄λμ€(Virtual Base Class)μ λν΄ μμ보μ.
μλμ μμλ C++μμ λ€μ€ μμμ μ¬μ©νλ κ²½μ° λ°μν μ μλ ꡬ쑰μ λ¬Έμ λ₯Ό μ€λͺ νλ©°, κ°μ μμ(Virtual Inheritance)μ μ¬μ©ν΄ μ΄λ₯Ό ν΄κ²°νλ λ°©λ²μ 보μ¬μ€λ€.

λ€μ΄μλͺ¬λ νν: μμ ꡬ쑰λ₯Ό 보면 Person ν΄λμ€κ° λ λ² μμλμ΄, TA ν΄λμ€μμ Person ν΄λμ€μ λ κ°μ 볡μ¬λ³Έμ κ°μ§κ² λ¨. μ΄λ¬ν λ€μ€ μμ ꡬ쑰μμ, TA ν΄λμ€λ Person ν΄λμ€λ₯Ό λ λ² μμλ°κ² λλλ°, μ΄λ‘ μΈν΄ TA ν΄λμ€ λ΄μμ Person ν΄λμ€μ λ©€λ²κ° μ€λ³΅μΌλ‘ μ‘΄μ¬νκ² λλ€
λ¬Έμ μ :
TA ν΄λμ€μμ Person ν΄λμ€μ λ©€λ²μ μ κ·Όν λ, μ΄λ€ Person ν΄λμ€λ₯Ό μ°Έμ‘°ν μ§ μ λ§€ν΄μ§λ λ¬Έμ κ° λ°μ
μλ₯Ό λ€μ΄, TA κ°μ²΄μμ Person ν΄λμ€μ λ©€λ²λ₯Ό νΈμΆνλ©΄ Studentλ‘λΆν° μμλ Personμ λ©€λ²μΈμ§, Teacherλ‘λΆν° μμλ Personμ λ©€λ²μΈμ§ λͺ¨νΈνλ€
λ¬Έμ ν΄κ²° : κ°μ μμ (Virtual Inheritance)
κ°μ μμμ μ μ©:
Studentμ Teacher ν΄λμ€κ° Person ν΄λμ€λ₯Ό μμν λ virtual ν€μλλ₯Ό μ¬μ©νμ¬ κ°μ μμμ μ μ©
μ΄λ‘ μΈν΄ Studentμ Teacher ν΄λμ€λ Person ν΄λμ€μ λ¨μΌ μΈμ€ν΄μ€λ₯Ό 곡μ νκ² λλ€.
κ²°κ³Ό:
- TA ν΄λμ€λ μ΄μ Person ν΄λμ€μ 볡μ¬λ³Έμ νλλ§ κ°μ§κ² λλ€
- TA ν΄λμ€μμ Person ν΄λμ€μ λ©€λ²μ μ κ·Όν λ, Studentμ Teacher λ μ€ μ΄λ μͺ½μ ν΅ν΄ μ κ·ΌνλλΌλ λμΌν Personμ λ©€λ²μ μ κ·Όνκ² λλ€
- μ΄λ κ² ν¨μΌλ‘μ¨ λ€μ΄μλͺ¬λ μμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.

μν©:
Person ν΄λμ€μ print() ν¨μκ° μ μλμ΄ μκ³ , Studentμ Teacher ν΄λμ€μμ print() ν¨μκ° μ¬μ μ(μ€λ²λΌμ΄λ©)λλ€.
TA ν΄λμ€μμ print() ν¨μλ₯Ό νΈμΆν λ, Studentμ Teacher ν΄λμ€μ print() ν¨μκ° νΈμΆλλ©°, κ°κ°μ ν¨μ λ΄μμ Person ν΄λμ€μ print()λ₯Ό νΈμΆνλ€.
λ¬Έμ λ°μ: TA ν΄λμ€μμ print() ν¨μλ₯Ό νΈμΆνλ©΄ Person::print()κ° λ λ² νΈμΆλλ λ¬Έμ κ° λ°μ. μ΄λ Student::print()μ Teacher::print() κ°κ°μμ Person::print()λ₯Ό νΈμΆνκΈ° λλ¬Έ
ν΄κ²° λ°©λ²: κ°μ μμμ μ¬μ©νμ¬ Person ν΄λμ€λ₯Ό κ°μ κΈ°λ³Έ ν΄λμ€λ‘ λ§λ€λ©΄, TA ν΄λμ€μλ Person ν΄λμ€μ λ¨μΌ μΈμ€ν΄μ€λ§ μ‘΄μ¬νκ² λμ΄ Person::print()κ° λ λ² νΈμΆλλ λ¬Έμ κ° ν΄κ²°λλ€.
κ°μ ν¨μμ ν€μλ μ¬μ©
- κ°μ ν¨μ(Virtual Function)λ ν΄λμ€μ λ€νμ±(Polymorphism)μ ꡬννκΈ° μν΄ μ¬μ©λλ€.
- virtual, override, final ν€μλλ κ°μ ν¨μμ κ΄λ ¨λ λͺ
μμ μΈ μ 보λ₯Ό μ 곡νλ€.
- virtual: λΆλͺ¨ ν΄λμ€μμ κ°μ ν¨μλ‘ μ μΈλ ν¨μλ₯Ό μλ―Ένλ©°, νμ ν΄λμ€μμ μ¬μ μ(override)λ μ μμ΅λλ€.
- override: λΆλͺ¨ ν΄λμ€μμ μ μλ κ°μ ν¨μλ₯Ό μ¬μ μνκ³ μλ€λ κ²μ λͺ μμ μΌλ‘ λνλ. μ΄λ μ€μλ₯Ό μ€μ΄κ³ , μ½λμ λͺ νμ±μ λμΈλ€
- final: μ΄ ν¨μκ° λ μ΄μ νμ ν΄λμ€μμ μ¬μ μλμ§ μλλ‘ ν λ μ¬μ©ν¨. μ΄λ‘ μΈν΄ ν΄λμ€μ λμμ΄ νμ€ν κ³ μ λλ©°, μλνμ§ μμ μ€λ²λΌμ΄λ©μ λ°©μ§νλ€
- κ°μ ν¨μ μ μΈμμ μ΄λ€ μ€ νλλ§ λͺ μνλ κ²μ΄ λ°λμ§νλ€. μ΄λ μ½λμ λ¨μμ±κ³Ό λͺ νμ±μ λμ΄λ©°, λΆνμν μ€λ³΅μ νΌν μ μλ€.
μ΄λ₯Ό ν΅ν΄ 2κ°μ§ μ€λ₯λ₯Ό μ κ±°ν μ μλ€ : implicit virtual, implicit override

κ°μ μλ©Έμ(Virtual Destructor)
κ°μ μλ©Έμ(Virtual Destructor)λ κ°μ ν¨μκ° μλ ν΄λμ€μμ μ€μνλ€ κΈ°λ³Έ(Base) ν΄λμ€μ ν¬μΈν°λ₯Ό ν΅ν΄ νμ ν΄λμ€ κ°μ²΄λ₯Ό μμ ν λ, νμ ν΄λμ€μ μλ©Έμκ° νΈμΆλμ§ μμΌλ©΄ 리μμ€ λμκ° λ°μν μ μκΈ° λλ¬Έμ, μλ©Έμλ κ°μμΌλ‘ μ μΈλμ΄μΌ νλ€. μ΄λ delete μ°μ°μκ° κΈ°λ³Έ ν΄λμ€μ ν¬μΈν°λ‘ νΈμΆλ λ, μ¬λ°λ₯Έ νμ ν΄λμ€μ μλ©Έμκ° νΈμΆλλλ‘ λ³΄μ₯νλ€.
- κ°μ μλ©Έμλ μ£Όλ‘ public λλ protectedλ‘ μ μΈλλ€
- Public κ°μ μλ©Έμλ ν΄λμ€ μΈλΆμμ κ°μ²΄λ₯Ό μμ νκ² μμ ν μ μκ² ν΄μ€λ€
- Protected κ°μ μλ©Έμλ ν΄λμ€μ μΈλΆμμ μ§μ κ°μ²΄λ₯Ό μμ ν μ μλλ‘ μ ννμ§λ§, νμ ν΄λμ€ λ΄λΆμμλ μμ νκ² μμ κ° κ°λ₯νλ€
<μ°Έκ³ : JAVA ν΄λμ€μ λͺ¨λ λ©μλλ virtual ν΄λμ€μ΄λ€. μ¦ JAVAμμλ ν¨μ μ¬μ μλ κ³§ μ€λ²λΌμ΄λ©μ΄λ€>
'C Programming Language > C++' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
C++ μμΈ(Exception) μ²λ¦¬(Handling) : throw, try, catch (0) | 2024.09.06 |
---|---|
C++ Inheritance(μμ), μμκ³Ό μ€λ²λ‘λ©, ν νλ¦Ώκ³Ό μμμ κ΄κ³ (0) | 2024.09.01 |
C++ ν΄λμ€(Class)μ μ’ λ₯μ μΆμ ν΄λμ€(abstract classes) (0) | 2024.08.31 |
C++ Generic Programming : ν νλ¦Ώ(Templates) (0) | 2024.08.31 |
C++ μ°μ°μ μ€λ²λ‘λ©(Operator Overloading) (0) | 2024.08.31 |