virtual functions fall 2008 dr. david a. gaitros [email protected]

12
Virtual Functions Fall 2008 Dr. David A. Gaitros [email protected] .edu

Upload: katrina-carr

Post on 23-Dec-2015

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual FunctionsFall 2008

Dr. David A. [email protected]

Page 2: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual Functions

Most of the time the compiler “binds” a function call to it’s definition after which no changes are allowed. This means that in order to accommodate all scenarios, you have to write your software from the start to account for them.

Changes to requirements required that you modify the code.

with Virtual functions we can accommodate changes in a more convenient fashion.

Page 3: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual Functions

• Example taken from the Savitch Book: class Sale

{public:

Sale();Sale(double thePrice);double getPrice() const;virtual double bill() const;double savings(const Sale& other) const;

private:double price;

};Note the word “virtual” before the

declaration of double bill() const;

This means that at a later date, a class that inherits the class Sale can redefine this member function.

Page 4: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual Functions

• Here is what the original member implementation looks like:

double Sale::bill() const

{

return price;

}

Page 5: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

• Here is what a new class that inherits the class looks like that redefines the member function bill.

namespace SavitSale

{

class DiscountSale: public Sale

{

public:

DiscountSale();

double getDiscount()const;

void setDiscount (double d);

double bill() const;

private:

double discount;

};

} // end SavitSale

Page 6: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual Functions

• A virtual function is indicated by including the modifier virtual in the member function declaration.

• If a function is virtual and a new definition of the function is given in a derived class, then for any object of the derived class, that object will always use the new definition. Even if it is invoked in the inherited function. This is called late binding.

Page 7: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual Functions

• Virtual function in base class:– "Automatically" virtual in derived

class

• Derived class declaration (in interface)– Not required to have "virtual"

keyword– But typically included anyway,

for readability

• The “virtual” term tells the compiler to wait to define it until it is called.

Page 8: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual functions

• Clear advantages to virtual functions as we’ve seen

• One major disadvantage: overhead!– Uses more storage– Late binding is "on the fly", so programs

run slower (Much slower)

• So if virtual functions not needed, should not be used. If you know all of the functionality, go ahead and program it.

Page 9: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Virtual Destructors

• Recall: destructors needed to de-allocatedynamically allocated data

• Consider:Base *pBase = new Derived;…delete pBase;– Would call base class destructor even

thoughpointing to Derived class object!

– Making destructor virtual fixes this!• Good policy for all destructors to be

virtual in production programming

Page 10: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Inner Workings of Virtual Functions

• Don’t need to know how to use it!– Principle of information hiding

• Virtual function table– Compiler creates it– Has pointers for each virtual member

function– Points to location of correct code for that

function

• Objects of such classes also have pointer– Points to virtual function table

Page 11: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Abstract Classes

• Pure virtual functions are defined as those functions that have no exact definition at the time of compile.

• Example ( Myers’ Employee)#ifndef _EMPLOYEE_H #define _EMPLOYEE_H class Employee { public: virtual void PrintCheck()=0; protected: float netPay; Employee(); Employee(char* n, char* a, char* ssn); char name[30]; char address[80]; char socSecNumber[12]; };

Page 12: Virtual Functions Fall 2008 Dr. David A. Gaitros dgaitros@admin.fsu.edu

Abstract Classes

• Note the “=0” in the PrintCheck function declaration. This tells compiler that there will be no implementation seen at this time.

• Any class with at least one pure virtual Function is known as an “Abstract Class”.

• Abstract classes can be used to build pointers to a class which you may want to define at a later time.

• Templates are coming!