+ 1
Can someone explain me simply what is virtual fonction
Im confused :(
11 Answers
+ 1
Say you have two classes like Dog and Chiwawa
and 'Chiwawa : public Dog' (aka inherits).
Sure, both can bark so you would put a bark method in the Dog class. But saying that their bark is the same is just pure nonsense so you make the Bark() in the Dog to be virtual : thus overrideable. Now you need to define Bark() in both classes separetly.
What this does, if you create a Chiwawa with a pointer to an ancestor (polymorphism) like
Dog* chiwi = new Chiwawa();
And call
chiwi->Bark();
It will do the Chiwawa classes Bark rather than the Dogs
+ 3
@Norbivar, so the chiwi is an instance of Dog, or Chiwawa? I lost you there..help appreciated.
+ 3
@Norbivar, I had doubt because I see two classes in the line, Dog and Chiwawa, so the object willl always be created based from the class following the "new" is that correct? thanks for explaining mate :)
+ 3
@Norbivar, hope you don't mind me asking again, is it necessary for the Dog class to be virtual for such instantiation process? and when should we choose:
Dog chiwi = new Chiwawa;
over the regular way like:
Chiwawa chiwi = new Chiwawa;
+ 3
@Norbivar, yeah I'm somewhat confused between abstract and virtual, and mixed up C++ and Java. I appreciate your time and understanding, and the answers, at least now I'm getting somewhere. Hey I guess your answer earned the best answer mark here, given the details of it :-)
Big Thanks mate...
+ 3
@Galagann, the checkmark next to Norbivar answer would look lots better in green :-D
+ 2
chiwi is an instance (or object), chiwawa is the class :)
+ 2
Exactly, but that is not a problem here since Dog is the parent from the Chiwawa class thus a pointer of the Dog class pointing to a Chiwawa is perfectly fine.
+ 2
@Norbivar thank you ! :D
+ 1
Virtual functions come into play only when you are using a parent-type (e.g. Dog to Chiwawa object) pointer. To get terms correct : classes aren't virtual, only methods are (and inheritence but that doesn't matter now).
Use this only if you want to store/handle overall Dogs together.
You could have a lot more type of dogs all inheriting from Dog and you might want to store them in a single array/container. Since C++ is strongly typed, each container can contain ONE type of objects. Pointers to base class for example are one type of objects but allows you to (as in this case) behave differently if used with virtual functions depending on the actual object it is pointin to.
(I understand that this is a bit confusing now, but it's not hard, just overwhelming :) )
+ 1
Only classes are abstract and only functions can be virtual. :)
In C++, abstract classes are which have at least one PURE virtual function, that is they do not have a definition in the class they are declared in.
Now logically, you cannot instantiate from a class which has an undefined method as such would be like a null pointer, which is bad.
So it can only be inherited from, but if you want to instantiate those, they must define (effectively override) that/those (pure) virtual functions.
Cheers mate, glad to be of assistance, anytime :)