Virtual methods & overriding in C++

A few months ago my friend asked me if I could explain a virtual methods in C++. How to use them, how to implement and why are these so important when programming?

Today I am going to answer all of these questions. First of all, we use virtual methods during inheritance. We create a pointer of base class type, but it is a pointer to our inheriting class. As you can guess, if there are only normal (not virtual) methods, when we create object of our inheriting class type, it would have only methods from a base class, not from its own. In situations like this we have to override methods from a base class – and we use a virtual methods.

We can create a base class, which has only virtual methods – we name it abstract class – or with normal & virtual. If you create a class with virtual methods, it is nice to create a virtual destructor.

Let’s start with a short example written in C++


#include <iostream>

using namespace std;

class CBook      //our base class
{
public:
 CBook(){};     // default constructor
 CBook(int cost); // another constructor
 virtual ~CBook(){} // destructor(remember - virtual)
 virtual void SetTitle() { cout << "Just a book" << endl; } //virtual method which we are going to override
 /*int GetCost() { cout << itsCost << endl; } //accessor
 void SetCost(int cost) { itsCost = cost; } //mutator*/
/*protected: //protected, because it would be only visible to a base and inheriting classes
 int itsCost;*/
};

class CCrimeBook : public CBook
{
public:
 CCrimeBook(){};
 virtual ~CCrimeBook(){}
 void SetTitle() { cout << "Crime book" << endl; } //here we override method from a base class
};

 CBook::CBook(int cost) : itsCost(cost){}
 int _tmain(int argc, _TCHAR* argv[])
 {
 CBook *pBook; //here we create a pointer of a base class type

 int choice;
 bool quit;
 quit = false;

while(!quit)
 {
 cin >> choice;
 switch(choice)
 {
 case 1:
 pBook = new CBook(); //we assign a new object of CBook to our pointer
 pBook->SetTitle(); //setting and getting title
 break;
 case 2:
 pBook = new CCrimeBook; //we assign a new object of CCrimeBook to our pointer
 pBook->SetTitle();//setting and getting title
 break;
 default:
 quit = true;
 break;
 }
 }
 return 0;
}

I hope that it is helpful and useful. Example of working appclication below.

Zostaw komentarz

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s