로또
가상 함수 본문
정의
자식 Class에서 다시 정의할 멤버 함수.
가상 함수를 사용하면 함수 호출을 만드는 데 사용한 식과 관계없이 개체에 적합한 함수가 호출된다.
virtual keyword를 사용하지 않을 경우
class Parent{
public:
void print() {
cout << "In Parent: void Print()" << endl;
}
};
class Child : public Parent{
public:
void print() {
cout << "In Child: void Print()" << endl;
}
};
int main(){
Parent* p1;
Parent* p2;
Parent p;
Child c;
p1 = &p;
p2 = &c;
p1->print();
p2->print();
}

virtual keyword를 사용할 경우
class Parent{
public:
virtual void print() {
cout << "In Parent: void Print()" << endl;
}
};
class Child : public Parent{
public:
void print() {
cout << "In Child: void Print()" << endl;
}
};
int main(){
Parent* p1;
Parent* p2;
Parent p;
Child c;
p1 = &p;
p2 = &c;
p1->print();
p2->print();
}

Virtual 이란
virtual keyword를 추가하면 해당 함수를 가상 함수로 만든다.
C++ 컴파일러는 Class에 가상 함수가 존재하면 가상 함수 테이블을 생성한다.
가상 함수 테이블
가상 함수 테이블에는 가상 함수들의 주소가 저장되어있다.
가상 함수가 호출될 때 가상 함수 테이블을 거쳐서 호출되는 함수가 결정된다. (Dynamic Binding)
각 객체는 가상 함수 테이블 포인터를 가져 해당 객체의 클래스에서 정의된 가상 함수 테이블에 접근할 수 있다.
이를 통해, 객체가 함수를 호출 했을 때, 실제로 어떤 함수가 실행되는지 결정된다.
Pure virtual
부모 Class에서 가상 함수에 대한 구현이 없는 경우를 순수 가상 함수라고 한다.
순수 가상 함수를 가지는 Class는 Abstract Class로 간주된다.
Abstract Class
하나 이상의 순수 가상 함수를 가지는 Class이다.
객체를 생성할 수 없다.
하위 Class들에게 함수를 구현하도록 강제할 수 있다.
참고자료
https://learn.microsoft.com/ko-kr/cpp/cpp/virtual-functions?view=msvc-170
가상 함수
자세한 정보: 가상 함수
learn.microsoft.com
https://junstar92.tistory.com/177
[C++] 가상 함수 (virtual, override 키워드)
References Effective C++ (항목 9) 씹어먹는 C++ (https://modoocode.com/210) Contents 가상 함수 (virtual 키워드) 오버라이드(override 키워드) 다형성 (polymorphism) 생성자/소멸자에서의 가상 함수 호출(주의사항) 2021.07
junstar92.tistory.com
https://learn.microsoft.com/ko-kr/cpp/cpp/abstract-classes-cpp?view=msvc-170
추상 클래스(C++)
자세한 정보: 추상 클래스(C++)
learn.microsoft.com
가상함수(Virtual function)와 가상함수테이블(vtable)의 이해
오버라이딩(Overriding) 가상함수를 이해하기 위해선 오버라이딩(Overriding) 에 대해서 알아야 한다. SourceCode(1) class Parent{ void show(){ printf("this is parent\n"); } } class Child : public Parent{ void show(){ printf("this i
cosyp.tistory.com