Here is how I understood not just what virtual functions are, but why they're required:
Let's say you have these two classes:
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."; } };
In your main function:
Animal *animal = new Animal; Cat *cat = new Cat; animal->eat(); // Outputs: "I'm eating generic food." cat->eat(); // Outputs: "I'm eating a rat."
So far so good, right? Animals eat generic food, cats eat rats, all without virtual.
Let's change it a little now so that eat() is called via an intermediate function (a trivial function just for this example):
// This can go at the top of the main.cpp file void func(Animal *xyz) { xyz->eat(); }
Now our main function is:
Animal *animal = new Animal; Cat *cat = new Cat; func(animal); // Outputs: "I'm eating generic food." func(cat); // Outputs: "I'm eating generic food."
Uh oh... we passed a Cat into func(), but it won't eat rats. Should you overload func() so it takes a Cat*? If you have to derive more animals from Animal they would all need their own func().
The solution is to make eat() from the Animal class a virtual function:
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."; } };
Main:
func(animal); // Outputs: "I'm eating generic food." func(cat); // Outputs: "I'm eating a rat."
Done.
https://stackoverflow.com/questions/2391679/why-do-we-need-virtual-functions-in-c
binding 과 관련된 일이다..필요하면 early binding/late binding 찾아봐
'Programming Language > C++' 카테고리의 다른 글
생성자 뒤에 콜론(:) (0) | 2017.03.08 |
---|---|
멀티쓰레드와 뮤텍스(소켓프로그래밍) multithread and mutex(socket programming) (0) | 2016.08.29 |
MultiThread Programming (0) | 2016.08.17 |