프로그래밍 언어/C++

C ++에서 가상 함수가 필요한 이유

Rateye 2021. 6. 8. 14:10
728x90
반응형
질문 : C ++에서 가상 함수가 필요한 이유는 무엇입니까?

저는 C ++를 배우고 있으며 가상 기능을 배우고 있습니다.

내가 읽은 (책과 온라인에서) 가상 함수는 파생 클래스에서 재정의 할 수있는 기본 클래스의 함수입니다.

virtual 을 사용하지 않고 파생 클래스의 기본 함수를 재정의 할 수있었습니다.

그래서 내가 여기서 무엇을 놓치고 있습니까? 나는 가상 기능에 더 많은 것이 있다는 것을 알고 있으며, 그것이 중요한 것 같아서 그것이 정확히 무엇인지 분명히하고 싶습니다. 온라인에서 정답을 찾을 수 없습니다.

답변

virtual 기능이 무엇인지 이해하는 방법뿐만 아니라 필요한 이유입니다.

다음 두 클래스가 있다고 가정 해 보겠습니다.

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."; }
};

주요 기능 :

Animal *animal = new Animal;
Cat *cat = new Cat;

animal->eat(); // Outputs: "I'm eating generic food."
cat->eat();    // Outputs: "I'm eating a rat."

지금까지 너무 좋았죠? 동물 고양이는 모두없는 쥐를 먹는 일반 음식을 먹는 virtual .

이제 조금 변경하여 eat() 가 중간 함수 (이 예제의 경우 간단한 함수)를 통해 호출되도록합니다.

// This can go at the top of the main.cpp file
void func(Animal *xyz) { xyz->eat(); }

이제 우리의 주요 기능은 다음과 같습니다.

Animal *animal = new Animal;
Cat *cat = new Cat;

func(animal); // Outputs: "I'm eating generic food."
func(cat);    // Outputs: "I'm eating generic food."

어 ... 우리는 고양이를 func() 전달했지만 쥐를 먹지 않습니다. func() 를 오버로드해야 Cat* ? Animal에서 더 많은 동물을 파생시켜야한다면 모두 고유 한 func() 가 필요합니다.

Animal 클래스의 eat() 를 가상 함수로 만드는 것입니다.

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."; }
};

본관:

func(animal); // Outputs: "I'm eating generic food."
func(cat);    // Outputs: "I'm eating a rat."

 

출처 : https://stackoverflow.com/questions/2391679/why-do-we-need-virtual-functions-in-c
728x90
반응형