다형성 사전 지식
멤버 함수
- 멤버 함수는 어디에 있는가?
- 멤버 함수는 클래스의 코드 섹션에 위치하며, 모든 클래스 객체가 공유한다.
- 각 개체마다 멤버 함수의 메모리가 잡혀있는가?
myCat->getName(); // "Coco" yourCat->getName(); // "Mocha"
- 함수의 동작은 완전히 일치하며, 매개변수로 받아도 된다.
- 저수준에서는 멤버 함수는 전역 함수와 크게 다르지 않다.
- 컴파일 시에 딱 한 번 메모리에 할당된다 (code section).
함수 오버라이딩
- 덮어쓰기
- 함수 정의가 같지만, 구현이 각 클래스마다 다른 것.
정적 바인딩 - 멤버 변수
- 선언된 클래스에 따라서 접근하는 코드 섹션을 구분한다.
동적 바인딩 - 가상 멤버 함수
// Animal.hpp
class Animal
{
public:
virtual void Move();
virtual void Speak();
};
// Animal.cpp
void Animal::Move()
{
}
void Animal::Speak()
{
std::cout << "An animal is speaking" << std::endl;
}
// Cat.hpp
class Cat : public Animal
{
public:
void Speak() override;
};
// Cat.cpp
void Cat::Speak()
{
std::cout << "Meow" << std::endl;
}
가상 함수
- 자식 클래스의 멤버 함수가 언제나 호출됨. 부모의 포인터 또는 참조를 사용 중이더라도.
- 동적 바인딩(dynamic) 혹은 늦은(late) 바인딩.
- 실행 중에 어떤 함수를 호출할지 결정함.
- 정적 바인딩보다 느리다.
가상 함수를 위해 가상 테이블이 생성됨.
- 모든 가상 멤버 함수의 주소를 포함.
- 개체 생성 시, 해당 클래스의 가상 테이블 주소가 함께 저장.
- 개체가 메모리에 생성될 때 가상 함수 테이블 주소가 함께 생성된다.
- 가상 함수의 주소를 찾기 위해 가상 함수 테이블을 사용.
- 점프 테이블 또는 룩업 테이블이라고도 함.
- Move()인지 Speak()인지를 가상 테이블과 대조해 결정함.
동적 바인딩 - 가상 멤버 함수
- 일단 오브젝트를 만들고 나면, 가상 테이블에 따라서 멤버 함수의 포인터가 연결됨.
- Move()인지 Speak()인지 가상 테이블과 대조하여 찾아봄.
'Language > C++' 카테고리의 다른 글
[C++] 21.Unmanaged Programming: 다중 상속 (1) | 2024.01.30 |
---|---|
[C++] 20.Unmanaged Programming: 가상 소멸자 (0) | 2024.01.30 |
[C++] 18.Unmanaged Programming: 상속(Inheritance) (0) | 2024.01.30 |
[C++] 17.Unmanaged Programming: 연산자 오버로딩과 const (0) | 2024.01.30 |
[C++] 16.Unmanaged Programming: Friend 키워드 (0) | 2024.01.29 |