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


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

  • 2016년 01월 06일에 작성됨

조회수 176


1 답변


좋아요
0
싫어요
채택취소하기

예제랑 같이 설명하겠습니다

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.
  • 2016년 01월 06일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close