티스토리 뷰
가상 함수(Virtual Function)
C++에서 자식 클래스에서 재정의(오버라이딩)할 것으로 기대하는 멤버 함수를 의미함
멤버 함수 앞에 virtual 키워드를 사용하여 선언함 → 실행시간에 함수의 다형성을 구현할 때 사용
선언 규칙
- 클래스의 public 영역에 선언해야 한다.
- 가상 함수는 static일 수 없다.
- 실행시간 다형성을 얻기 위해, 기본 클래스의 포인터 또는 참조를 통해 접근해야 한다.
- 가상 함수는 반환형과 매개변수가 자식 클래스에서도 일치해야 한다.
class parent {
public :
virtual void v_print() {
cout << "parent" << "\n";
}
void print() {
cout << "parent" << "\n";
}
};
class child : public parent {
public :
void v_print() {
cout << "child" << "\n";
}
void print() {
cout << "child" << "\n";
}
};
int main() {
parent* p;
child c;
p = &c;
p->v_print();
p->print();
return 0;
}
// 출력 결과
// child
// parent
parent 클래스를 가리키는 포인터 p를 선언하고 child 클래스의 객체 c를 선언한 상태
포인터 p가 c 객체를 가리키고 있음 (몸체는 parent 클래스지만, 현재 실제 객체는 child 클래스)
포인터 p를 활용해 virtual을 활용한 가상 함수인 v_print()와 오버라이딩된 함수 print()의 출력은 다르게 나오는 것을 확인할 수 있다.
가상 함수는 실행시간에 값이 결정됨 (후기 바인딩)
print()는 컴파일 시간에 이미 결정되어 parent가 호출되는 것으로 결정이 끝남
'Dev > C++' 카테고리의 다른 글
C/C++에서 특정 비트를 0, 1로 바꾸는 방법 (0) | 2020.08.06 |
---|---|
[C++] C++ 프로그램의 구조 (0) | 2020.07.18 |
[C++] 포인터(Pointer) vs 레퍼런스(Reference) (0) | 2020.07.17 |
[C++] 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) (0) | 2020.05.21 |
STL(Standard Template Library) 표준 C++ 라이브러리 (0) | 2020.04.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크