-
[C/C++ 강좌] 80강. 순수 가상 함수와 추상 클래스C++ 2022. 1. 19. 20:43
https://www.youtube.com/watch?v=5N2tc_DT_hg&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=85
1. 순수 가상함수
#include <iostream> using namespace std; class A { public: virtual void f() {} }; class B : public A { public: void f() {} }; int main() { A* a = new A; a->f(); delete a; }
위와 같은 코드가 있을 때 A클래스의 f()메서드는 가상함수지만 실제로는 가상이 아니고 우리가 호출 할 수 있다.
그런데 순수 가상함수로 만들면 호출이 불가능하게 막을 수 있다.
다음의 코드는 순수 가상함수를 만드는 방법이다.
virtual void f() = 0;
2. 추상 클래스
만약 어떤 클래스가 순수 가상함수를 1개 이상 가지고 있으면 그 클래스는 추상클래스가 된다.
그리고 추상클래스는 객체를 만들 수 없다.
추상클래스는 객체를 생성할 수 없기 때문에 혼자 있어서는 아무런 의미가 없고, 오직 오버라이딩과 같은 자식클래스를 통해서만 의미를 갖게된다.
그리고 추상클래스는 virtual로 선언만 멤버들을 반드시 선언하라는 말을 암시하고 있기 때문에 자식클래스의 틀을 결정하는 역할도 있다.
다음은 순수 가상함수를 이용한 클래스니까 편하게 보면 된다.
#include <iostream> using namespace std; const double PI = 3.141592653589793; class Shape { public: virtual double GetArea() = 0; virtual void Resize(double f) = 0; }; class Circle : public Shape { public: Circle(double r) : r(r) {} double GetArea() { return PI * r * r; } void Resize(double f) { r *= f; } private: double r; }; class Rectangle : public Shape { public: Rectangle(double a, double b) : a(a), b(b) {} double GetArea() { return a * b; } void Resize(double f) { a *= f; b *= f; } private: double a, b; }; int main() { Shape* shapes[] = { new Circle(3), new Rectangle(10, 5), }; for (Shape* s : shapes) { cout << s->GetArea() << endl; } for (Shape* s : shapes) { s->Resize(2); } for (Shape* s : shapes) { cout << s->GetArea() << endl; } for (Shape* s : shapes) { delete s; } }
'C++' 카테고리의 다른 글
[C/C++ 강좌] 82강. 상속에서의 형변환 (1) - 업캐스팅 (0) 2022.01.20 [C/C++ 강좌] 81강. 생성/소멸자 실행 순서와 가상 소멸자 (0) 2022.01.19 [C/C++ 강좌] 79강. 상속이 필요한 이유 (2) (0) 2022.01.19 [C/C++ 강좌] 78강. 가상 함수와 동적 바인딩 (0) 2022.01.19 [C/C++ 강좌] 77강. 오버라이딩과 정적 바인딩 (0) 2022.01.19