가상 함수 (virtual function)
- 부모 클래스의 메소드에 virtual을 붙이게 되면 가상 함수가 되면서, 부모 포인터로 업캐스팅 했을 시, 오버라이딩(재정의) 된 함수를 사용하게 해주는 방법이다.
※ 가상 함수가 존재하는 경우, 소멸자에도 virtual 키워드를 추가해줘야 자식 클래스의 소멸자가 호출된다.
이 작업을 하지 않는다면 자식 클래스의 소멸자가 호출되지 않는다.
가상 함수 추가!
- 가상 함수는 자식 클래스가 재정의할 수 있는 함수이다. 만약 상속 관계가 아니라면 가상 함수를 선언할 필요가 없으므로 가상 함수는 상속 계층내에서만 의미가 있으며 자식 클래스에게 재정의 기회를 주기 위해 존재하는 것이라고 할 수 있다. 그러나 가상 함수를 반드시 재정의해야만 하는 것은 아니다.
- 부모 클래스의 동작 그대로 쓰고 싶다면 단순히 상속만 받고 변경할 필요가 있을 때만 재정의하면 된다.
- 부모 클래스가 가상 함수를 만드는 이유는 혹시라도 재정의하고 포인터로 호출할 때를 대비한 것이다.
가상 함수는 재정의해도 되는 함수이지 반드시 재정의해야 하는 함수는 아니다.
동적 바인딩
- 가상 함수는 자신을 호출하는 객체의 타입, 즉 동적 타입에 따라 실제 호출될 함수가 결정된다. (포인터)
- 실행 중에 호출할 함수를 결정하는 결합 방법을 동적 결합(바인딩) 이라고 한다.
- 주소->메소드() 호출문을 미리 고정된 번지로 가서 호출하는 것이 아닌, 주소가 가리키는 객체의 타입에 따라 적절한 함수를 선택해서 호출하는 코드로 번역해야 하는 것이다.
- 이렇게 해야 전달된 객체에 따라 각기 다른 동작을 할 수 있는 다형성을 구현할 수 있다.
virtual을 적어 주게 된다면, 부모 클래스가 호출되는 것이 아닌, 정확히 말하자면 부모클래스에서 자식 클래스에 재정의된 함수를 사용하는 것이다. == 동적 바인딩
순수 가상 함수 (강제성 + 가상함수)
- 순수 가상 함수는 자식 클래스에서 반드시 재정의해야 하는 함수이다.
ex) 전자제품 마다의 on off 기능 - 장점? 실수를 안하게 된다.
- 순수 가상 함수는 일반적으로 함수의 동작을 정의하는 본체(바디)를 가지지 않는다. 그러므로 이 상태에서는 호출할 수 없다.
- 본체가 없다는 뜻으로 함수 선언부의 끝에 =0 이라는 표기를 하는데 이는 함수만 코드가 비어있다는 뜻이다.
추상 클래스
- 순수 가상 함수를 멤버로 가지는 클래스
인터페이스
- 순수 가상 함수로만 이루어진 클래스를 인터페이스라고 한다. 멤버 변수는 가지지 않는다.
- 인터페이스를 상속 받는 클래스들은 반드시 인터페이스 안에 있는 모든 함수들을 전부 재정의해야 한다.
- 인터페이스 클래스 이름 앞에 I를 붙여주는 것이 관습이다.
다중 상속
- 두 개 이상의 부모 클래스를 하나의 자식 클래스에 상속하는 것이다.
- 이미 잘 동작하는 클래스들을 다중 상속해서 새로운 클래스를 만들어 낼 수 있다는 것은 참으로 좋은 기능이다.
하지만 여러가지 문제점도 있고, 복잡도에 비해 실용성이 떨어지는 문법이기는 하다.
모호성
- 함수나 변수의 이름이 각각 다른 클래스에서 이름이 같을 시에, 메인 함수에서 호출시 어디 클래스에서 받아온건지 알려주어야 한다!
'C++언어 공부 > 개념 공부' 카테고리의 다른 글
2024.02.01 C++ 언어 공부 7일 차 (프렌드) (0) | 2024.02.02 |
---|---|
2024.02.01 C++ 언어 (인터페이스, 상속 실습) (0) | 2024.02.02 |
2024.01.30 C++ 언어 공부 5일 차 (상속 관련) (1) | 2024.01.30 |
2024.01.29 C++ 언어 공부 4일 차 (0) | 2024.01.29 |
2024.01.28 C++ 추가 공부 [얕은 복사, 깊은 복사] (0) | 2024.01.28 |