Write a Case study on virtual functions.
AIM:
Write
a Case study on virtual functions.
A virtual function is a member
function that you expect to be redefined in derived classes. When you refer to
a derived class object using a pointer or a reference to the base class, you
can call a virtual function for that object and execute the derived class's version
of the function.
Virtual functions ensure that the
correct function is called for an object, regardless of the expression used to
make the function call.
Suppose a base class contains a
function declared as virtual and
a derived class defines the same function. The function from the derived class
is invoked for objects of the derived class, even if it is called using a
pointer or reference to the base class. The following example shows a base
class that provides an implementation of the PrintBalance function
and two derived classes
// deriv_VirtualFunctions.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Account {
public:
Account(
double d ) { _balance = d; }
virtual double
GetBalance() { return _balance; }
virtual
void PrintBalance() { cerr << "Error. Balance not available for base
type." << endl; }
private:
double
_balance;
};
class CheckingAccount : public Account {
public:
CheckingAccount(double d) : Account(d) {}
void
PrintBalance() { cout << "Checking account balance: " <<
GetBalance() << endl; }
};
class SavingsAccount : public Account {
public:
SavingsAccount(double d) : Account(d) {}
void
PrintBalance() { cout << "Savings account balance: " <<
GetBalance(); }
};
int main() {
// Create
objects of type CheckingAccount and SavingsAccount.
CheckingAccount *pChecking = new CheckingAccount( 100.00 ) ;
SavingsAccount *pSavings = new SavingsAccount( 1000.00 );
// Call
PrintBalance using a pointer to Account.
Account
*pAccount = pChecking;
pAccount->PrintBalance();
// Call
PrintBalance using a pointer to Account.
pAccount =
pSavings;
pAccount->PrintBalance();
}
In the preceding code, the calls
to PrintBalance are identical, except for the
object pAccount points to. Because PrintBalance is virtual,
the version of the function defined for each object is called.
The PrintBalance function in the derived classes CheckingAccount and SavingsAccount "override"
the function in the base class Account.
If a class is declared that does not
provide an overriding implementation of the PrintBalance function,
the default implementation from the base class Account is used.
Functions in derived classes override
virtual functions in base classes only if their type is the same. A function in
a derived class cannot differ from a virtual function in a base class in its
return type only; the argument list must differ as well.
When calling a function using
pointers or references, the following rules apply:
- A call to a virtual function is resolved according to the
underlying type of object for which it is called.
- A call to a nonvirtual function is resolved according to the type
of the pointer or reference.
The following example shows how
virtual and nonvirtual functions behave when called through pointers:
// deriv_VirtualFunctions2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Base {
public:
virtual
void NameOf(); // Virtual
function.
void
InvokingClass(); // Nonvirtual
function.
};
// Implement the two functions.
void Base::NameOf() {
cout
<< "Base::NameOf\n";
}
void Base::InvokingClass() {
cout
<< "Invoked by Base\n";
}
class Derived : public Base {
public:
void
NameOf(); // Virtual function.
void
InvokingClass(); // Nonvirtual
function.
};
// Implement the two functions.
void Derived::NameOf() {
cout
<< "Derived::NameOf\n";
}
void Derived::InvokingClass() {
cout
<< "Invoked by Derived\n";
}
int main() {
// Declare
an object of type Derived.
Derived
aDerived;
// Declare
two pointers, one of type Derived * and the other
// of type Base *, and initialize them to point
to aDerived.
Derived
*pDerived = &aDerived;
Base *pBase
= &aDerived;
// Call
the functions.
pBase->NameOf(); //
Call virtual function.
pBase->InvokingClass(); //
Call nonvirtual function.
pDerived->NameOf(); //
Call virtual function.
pDerived->InvokingClass(); // Call nonvirtual function.
}
Labels: oop through c++ lab
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home