왜 virtual 메소드를 쓰는거에요?
조회수 7075회
C++을 이제 배우기 시작했는데요 virtual 메소드는 자식 클래스가 부모 클래스의 메소드를 override하려고 쓰는 거 아닌가요? 그냥 override하면 되지 왜 굳이 virtual 키워드를 써야 하나요?
1 답변
-
예제랑 같이 설명하겠습니다
class Animal { public: void eat() { std::cout << "I'm eating generic food."; } }; class Cat : public Animal { public: void eat() { std::cout << "I'm eating a rat."; } }; int main(){ Animal *animal = new Animal; Cat *cat = new Cat; animal->eat(); // outputs: "I'm eating generic food." cat->eat(); // outputs: "I'm eating a rat." }
I'm eating generic food. I'm eating a rat.
인 코드에서
void func(Animal *xyz) { xyz->eat(); }
를 추가시켜 다음같은 코드를 만들었다고 하면class Animal { public: void eat() { std::cout << "I'm eating generic food."; } }; class Cat : public Animal { public: void eat() { std::cout << "I'm eating a rat."; } }; void func(Animal *xyz) { xyz->eat(); } int main(){ Animal *animal = new Animal; Cat *cat = new Cat; func(animal); // outputs: "I'm eating generic food." func(cat); // outputs: "I'm eating generic food." }
I'm eating generic food. I'm eating generic food.
func(cat)을 호출했는데 "I'm eating a rat." 이 아닌 "I'm eating generic food."이 나왔지요 여기서 더 많은 동물들을 추가하면 어떻게 될까요? 동물 하나하나를 위해 func()를 오버로딩 해야 할까요?
virtual 메소드는 이런 상황에서 씁니다.
class Animal { public: virtual void eat() { std::cout << "I'm eating generic food."; } }; class Cat : public Animal { public: void eat() { std::cout << "I'm eating a rat."; } }; void func(Animal *xyz) { xyz->eat(); } int main(){ Animal *animal = new Animal; Cat *cat = new Cat; func(animal); // outputs: "I'm eating generic food." func(cat); // outputs: "I'm eating a rat." }
I'm eating generic food. I'm eating a rat.
댓글 입력