-
[C/C++ 강좌] 78강. 가상 함수와 동적 바인딩C++ 2022. 1. 19. 17:51
https://www.youtube.com/watch?v=F8n7Ruc8Lgg&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=83
1. 동적 바인딩과 가상 함수
정적 바인딩은 부모 클래스의 포인터가 자식 클래스를 동적할당 하고 있을 때 멤버가 호출이되면 부모 클래스의 멤버가 호출이 되는 것이었다.
그리고 동적바인딩은 멤버가 호출이 되었을 때 부모 클래스의 멤버가 호출될 지 자식 클래스의 멤버가 호출될 지를 정할 수 있는 것이다.#include <iostream> using namespace std; class Weapon { public: Weapon(int power) : power(power) { cout << "Weapon(int)" << endl; } void Use() { cout << "Weapon::Use()" << endl; } protected: int power; }; class Sword : public Weapon { public: Sword(int power) : Weapon(power) { cout << "Sword(int)" << endl; } void Use() { cout << "Sword::Use()" << endl; Swing(); } private: void Swing() { cout << "Swing sword." << endl; } }; class Magic : public Weapon { public: Magic(int power, int manaCost) : Weapon(power), manaCost(manaCost) { cout << "Magic(int, int)" << endl; } void Use() { cout << "Magic::Use()" << endl; Cast(); } void Cast() { cout << "Cast magic." << endl; } private: int manaCost; }; int main() { Sword mySword(10); Magic myMagic(15, 7); mySword.Use(); myMagic.Use(); Weapon* currentWeapon; currentWeapon = &mySword; currentWeapon->Use(); }
위의 코드를 실행하면 정적 바인딩이 되므로 Weapon클래스의 Use()메서드가 호출이 된다.
그러나 Sword클래스의 Use()메서드를 호출하고 싶으면 Weapon 클래스의 Use()메서드에 virtual키워드(가상 함수)만 추가해주면 된다.virtual void Use() { cout << "Weapon::Use()" << endl; }
'C++' 카테고리의 다른 글
[C/C++ 강좌] 80강. 순수 가상 함수와 추상 클래스 (0) 2022.01.19 [C/C++ 강좌] 79강. 상속이 필요한 이유 (2) (0) 2022.01.19 [C/C++ 강좌] 77강. 오버라이딩과 정적 바인딩 (0) 2022.01.19 [C/C++ 강좌] 76강. 상속이 필요한 이유 (1) (0) 2022.01.19 [C/C++ 강좌] 75강. 상속과 접근 제어 (0) 2022.01.19