Re: Virtual Function Question
vkp wrote:
On Jul 2, 4:23 pm, Pete Becker <p...@versatilecoding.com> wrote:
vkp wrote:
Hi All,
Need little education on use of Virtual functions....the questions
arose from the existing code I am going through.
Class type -> Derived, Member funtion -> Not virtual, Calls Derived
first then base.
Class type -> Derived, Member funtion -> Virtual, Calls Derived first
then base.
Class type -> Base, Member funtion -> Not Virtual, Calls Base.
Class type -> Base, Member funtion -> Virtual, Calls Derived first
then base.
What happens if both Base class and derived class declare a function
virtual. Who gets the first call? Is it valid to delclare a function
Virtual in both classes? If valid, is it a good design? Is there a
situation that requires such declarations?
Show some code.
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of
"The Standard C++ Library Extensions: a Tutorial and Reference"
(www.petebecker.com/tr1book)- Hide quoted text -
- Show quoted text -
Here is sample code for the question:
Case 1: Base class declares function "test" as virtual so method
doTest calls derived class when input object is of derived type. (This
is clear to me).
// Base class
class base
{
public:
base(void);
~base(void);
virtual void test(){
std::cout<<"Base::test called\n";
}
};
// Derived class
class derived :
public base
{
public:
derived(void);
~derived(void);
void test(){
std::cout<<"Derived::test called\n";
}
};
// Function that calls class methods.
// function expects base class and calls method a.
void doTest (base& a_base)
{
std::cout << "Calling functions in the base class\n";
a_base.test();
}
// Main function.
int _tmain(int argc, _TCHAR* argv[])
This is a Microsoftism. Unless you're posting to a Microsoft forum, use
int main()
or
int main(int argc, char *argv[])
{
dreived a_derived; // derived object
base b_base; // base object
doTest(a_derived); // calls method that expects Base object
doTest(b_base);
return 0;
}
// End of code.
Case 2: What if class derived also declares function "test" as
virtual?
Doesn't matter. When a function in a base class is declared virtual, a
function in a derived class with the same signature overrides it. That's
what you're seeing.
The overriding function is also virtual, so if you had yet another level
of derivation above that, a function with the same signature would
override both derived::test and base::test.
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of
"The Standard C++ Library Extensions: a Tutorial and Reference"
(www.petebecker.com/tr1book)