왜 virtual 메소드를 쓰는거에요?

C++을 이제 배우기 시작했는데요 virtual 메소드는 자식 클래스가 부모 클래스의 메소드를 override하려고 쓰는 거 아닌가요? 그냥 override하면 되지 왜 굳이 virtual 키워드를 써야 하나요?

1답변

  • 좋아요

    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.
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.