상속과 다형성의 중요성
상속과 다형성은 객체 지향 프로그래밍의 핵심 개념입니다. 이를 통해 코드 재사용성을 높이고, 유연하고 확장 가능한 소프트웨어를 개발할 수 있습니다. 고급 상속 및 다형성 기법을 사용하면 더 효과적으로 객체 간의 관계를 정의하고, 유지보수가 용이한 코드를 작성할 수 있습니다.
기본 상속과 다형성
기본적인 상속과 다형성은 다음과 같이 정의할 수 있습니다:
#include <iostream>
class Base {
public:
virtual void show() {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void show() override {
std::cout << "Derived class" << std::endl;
}
};
int main() {
Base* basePtr = new Derived();
basePtr->show(); // Derived class
delete basePtr;
return 0;
}
위 코드에서 Base
클래스는 show
함수를 가상 함수로 선언하고, Derived
클래스는 show
함수를 재정의합니다. 이를 통해 런타임 다형성을 구현할 수 있습니다.
고급 상속 기법
1. 다중 상속
다중 상속은 하나의 클래스가 둘 이상의 클래스를 상속받는 기법입니다. 다중 상속은 복잡성을 증가시키고, 다이아몬드 상속 문제를 일으킬 수 있습니다.
#include <iostream>
class A {
public:
void show() {
std::cout << "Class A" << std::endl;
}
};
class B {
public:
void show() {
std::cout << "Class B" << std::endl;
}
};
class C : public A, public B {
public:
void show() {
A::show();
B::show();
}
};
int main() {
C obj;
obj.show();
return 0;
}
2. 가상 상속
가상 상속은 다이아몬드 상속 문제를 해결하기 위한 기법입니다. 이를 통해 다중 상속에서 공통 기초 클래스가 하나의 인스턴스만 생성되도록 합니다.
#include <iostream>
class A {
public:
void show() {
std::cout << "Class A" << std::endl;
}
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
int main() {
D obj;
obj.show();
return 0;
}
고급 다형성 기법
1. 순수 가상 함수와 추상 클래스
순수 가상 함수는 서브 클래스에서 반드시 재정의해야 하는 함수입니다. 추상 클래스는 하나 이상의 순수 가상 함수를 가진 클래스입니다.
#include <iostream>
class Base {
public:
virtual void show() = 0; // 순수 가상 함수
};
class Derived : public Base {
public:
void show() override {
std::cout << "Derived class" << std::endl;
}
};
int main() {
Derived d;
d.show();
return 0;
}
2. 다형성 캐스팅
다형성 캐스팅은 dynamic_cast
를 사용하여 런타임에 타입 안전한 캐스팅을 수행하는 기법입니다.
#include <iostream>
class Base {
public:
virtual void show() {
std::cout << "Base class" << std::endl;
}
};
class Derived : public Base {
public:
void show() override {
std::cout << "Derived class" << std::endl;
}
};
int main() {
Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {
derivedPtr->show(); // Derived class
}
delete basePtr;
return 0;
}
실습 문제
문제 1: 가상 상속과 다형성 기법 사용하기
다음 코드에서 가상 상속을 사용하여 다이아몬드 상속 문제를 해결하고, 순수 가상 함수를 사용하여 다형성을 구현하세요.
main.cpp
#include <iostream>
class A {
public:
void show() {
std::cout << "Class A" << std::endl;
}
};
class B : public A {};
class C : public A {};
class D : public B, public C {
public:
void show() override {
std::cout << "Class D" << std::endl;
}
};
int main() {
D obj;
obj.show();
return 0;
}
해답:
main.cpp (가상 상속 및 순수 가상 함수 적용)
#include <iostream>
class A {
public:
virtual void show() = 0; // 순수 가상 함수
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {
public:
void show() override {
std::cout << "Class D" << std::endl;
}
};
int main() {
D obj;
obj.show();
return 0;
}
이제 열세 번째 날의 학습을 마쳤습니다. 고급 상속 및 다형성 기법을 이해하고, 이를 구현하는 방법을 학습했습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "CRTP(Curiously Recurring Template Pattern) 사용법"에 대해 학습하겠습니다.
'-----ETC----- > C++ 성능 최적화 및 고급 테크닉 시리즈' 카테고리의 다른 글
[C++ 성능 최적화 및 고급 테크닉] Day 15: 멀티스레딩의 기본 개념 (0) | 2024.08.01 |
---|---|
[C++ 성능 최적화 및 고급 테크닉] Day 12: C++11/14/17/20의 새로운 기능 활용 (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 11: 표현식 템플릿 (Expression Templates) (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 9: 완벽한 전달 (Perfect Forwarding) (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 10: inline 함수와 매크로의 사용 (0) | 2024.08.01 |