17
Virtual Virtual Functions Functions Chapter: Chapter: 11 11 Lecture: 42 and 43 Lecture: 42 and 43 Date: 23.10.2012 and Date: 23.10.2012 and 31.10.2012 31.10.2012

Lec 42.43 - virtual.functions

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Lec 42.43 - virtual.functions

Virtual FunctionsVirtual Functions

Chapter: Chapter: 1111

Lecture: 42 and 43Lecture: 42 and 43

Date: 23.10.2012 and Date: 23.10.2012 and 31.10.201231.10.2012

Page 2: Lec 42.43 - virtual.functions

Advanced C++ TopicsAdvanced C++ Topics

Virtual functionsVirtual functions Friend functionsFriend functions Static functionStatic function Overloaded “= ” operatorOverloaded “= ” operator Overloaded Copy ConstructorOverloaded Copy Constructor ““this” pointerthis” pointer

Page 3: Lec 42.43 - virtual.functions

Motivation: Virtual Motivation: Virtual FunctionsFunctions

a hierarchy of a hierarchy of geometric shape geometric shape classesclasses draws circles, draws circles,

ellipses, ellipses, rectangles etcrectangles etc

just use method just use method drawdraw throughout throughout the hierarchythe hierarchy

Line

Rectangle Circle

Square Ellipse

draw()

draw()

draw()

draw()

draw()

Page 4: Lec 42.43 - virtual.functions

Pointers to Derived Pointers to Derived ClassesClasses

C++ allows base class pointers to C++ allows base class pointers to point to derived class objects.point to derived class objects.

Let we haveLet we have class base { … };class base { … }; class derived : public base { … };class derived : public base { … };

Then we can write:Then we can write:

base *p1; base *p1;

derived d_obj; derived d_obj;

p1 = &d_obj;p1 = &d_obj;

Page 5: Lec 42.43 - virtual.functions

class Baseclass Base { { public:public: void show() {void show() { cout << “base\n”;cout << “base\n”; }} };}; class Derv1 class Derv1 : public base : public base

{{ public:public: void show() {void show() { cout << “derived1\cout << “derived1\

n”;n”; }} class Derv2 class Derv2 : public base : public base

{{ public:public: void show() {void show() { cout << “derived2\cout << “derived2\

n”;n”; }} };};

void main() void main() {{

Derv1 dv1;Derv1 dv1; Derv2 dv2;Derv2 dv2;

Base *ptr Base *ptr ptr = &dv1;ptr = &dv1; ptr->show(); ptr->show();

ptr = &dv2;ptr = &dv2; ptr ->show(); ptr ->show();

return 0;return 0; }}

Page 6: Lec 42.43 - virtual.functions

Non-Virtual Pointer Non-Virtual Pointer AccessAccess

Page 7: Lec 42.43 - virtual.functions

class Baseclass Base { { public:public: virtualvirtual void show() { void show() { cout << “base\n”;cout << “base\n”; }} };}; class Derv1 class Derv1 : public base : public base

{{ public:public: void show() {void show() { cout << “derived1\cout << “derived1\

n”;n”; }} class Derv2 class Derv2 : public base : public base

{{ public:public: void show() {void show() { cout << “derived2\cout << “derived2\

n”;n”; }} };};

void main() void main() {{

Derv1 dv1;Derv1 dv1; Derv2 dv2;Derv2 dv2;

Base *ptr Base *ptr ptr = &dv1;ptr = &dv1; ptr->show(); ptr->show();

ptr = &dv2;ptr = &dv2; ptr ->show(); ptr ->show();

return 0;return 0; }}

Page 8: Lec 42.43 - virtual.functions

Non-Virtual Pointer Non-Virtual Pointer AccessAccess

Page 9: Lec 42.43 - virtual.functions

Introduction to Virtual Introduction to Virtual FunctionsFunctions

A virtual function is a member function that is A virtual function is a member function that is declared within a base class and redefined declared within a base class and redefined (called (called overridingoverriding) by a derived class.) by a derived class.

It implements the “one interface, multiple It implements the “one interface, multiple methods” philosophy that underlies methods” philosophy that underlies polymorphism.polymorphism.

The keyword The keyword virtualvirtual is used to designate a is used to designate a member function as virtual.member function as virtual.

Supports run-time polymorphism with the Supports run-time polymorphism with the help of base class pointers.help of base class pointers.

Page 10: Lec 42.43 - virtual.functions

Introduction to Virtual Introduction to Virtual Functions (contd.)Functions (contd.)

While redefining a virtual function in a While redefining a virtual function in a derived class, the function signature must derived class, the function signature must match the original function present in the match the original function present in the base class.base class.

So, we call it So, we call it overridingoverriding, not overloading., not overloading. When a virtual function is redefined by a When a virtual function is redefined by a

derived class, the keyword derived class, the keyword virtualvirtual is not is not needed (but can be specified if the needed (but can be specified if the programmer wants).programmer wants).

The “virtual”-ity of the member function The “virtual”-ity of the member function continues along the inheritance chain.continues along the inheritance chain.

A class that contains a virtual function is A class that contains a virtual function is referred to as a referred to as a polymorphic classpolymorphic class..

Page 11: Lec 42.43 - virtual.functions

Abstract Classes and Abstract Classes and Pure Virtual FunctionsPure Virtual Functions

A base class whose objects are never A base class whose objects are never instantiated is called an abstract class. instantiated is called an abstract class. Such a class exists only to act as a parent Such a class exists only to act as a parent of derived classes that will be used to of derived classes that will be used to instantiate objects.instantiate objects.

A base class made as an abstract class must A base class made as an abstract class must contain at least one contain at least one purepure virtual functionvirtual function..

A pure virtual function is one with the A pure virtual function is one with the expression “expression “=0=0”” added to the function added to the function declaration.declaration.e.g., e.g.,

virtual void show()virtual void show() = 0; = 0;

Page 12: Lec 42.43 - virtual.functions

class Baseclass Base { { public:public: virtualvirtual void show() = 0; void show() = 0; };};

class Derv1 class Derv1 : public base : public base {{

public:public: void show() {void show() { cout << “derived1\n”;cout << “derived1\n”; }}

class Derv2 class Derv2 : public base : public base {{

public:public: void show() {void show() { cout << “derived2\n”;cout << “derived2\n”; }} };};

void main() void main() {{

Base bad; Base bad; //ERROR//ERROR

Derv1 dv1;Derv1 dv1; Derv2 dv2;Derv2 dv2;

Base *ptr Base *ptr ptr = &dv1;ptr = &dv1; ptr->show(); ptr->show();

ptr = &dv2;ptr = &dv2; ptr ->show(); ptr ->show();

return 0;return 0; }}

Page 13: Lec 42.43 - virtual.functions

Virtual Function and Virtual Function and personperson Class Class

C++ program example, Robert Lafore, C++ program example, Robert Lafore, 44thth ed. p.511. ed. p.511.

Page 14: Lec 42.43 - virtual.functions

Virtual Base ClassesVirtual Base ClassesM

ult

iple

M

ult

iple

In

heri

tan

ce

Inh

eri

tan

ce

Page 15: Lec 42.43 - virtual.functions

Virtual Base ClassesVirtual Base Classes class Parentclass Parent { { protected:protected: int basedata; int basedata; };};

class Child1 class Child1 : public parent {: public parent {{{ }; };

class Child2 class Child2 : public base {: public base {{{ }; };

class class GrandChildGrandChild: : public Child1, public Child2public Child1, public Child2

{ public:{ public: int getdata() { return basedata; } int getdata() { return basedata; } //ERROR//ERROR

};};

Page 16: Lec 42.43 - virtual.functions

Virtual Base ClassesVirtual Base Classes class Parentclass Parent { { protected:protected: int basedata; int basedata; };};

class Child1 class Child1 : : virtual virtual public public parent {parent {{{ }; };

class Child2 class Child2 :: virtual virtual public public base {base {{{ }; };

class class GrandChildGrandChild: : public Child1, public Child2public Child1, public Child2

{ { public:public:

int getdata() int getdata() { return basedata; } { return basedata; }

//OK//OK};};

class Parentclass Parent { { protected:protected: int basedata; int basedata; };};

class Child1 class Child1 : public : public parent {parent {{{ }; };

class Child2 class Child2 : public base : public base {{{{ }; };

class class GrandChildGrandChild: : public Child1, public public Child1, public Child2Child2

{ { public:public:

int getdata() int getdata() { return basedata; } { return basedata; }

//ERROR//ERROR };};

Page 17: Lec 42.43 - virtual.functions

Friend FunctionsFriend Functions

Encapsulation and data-hiding dictate that Encapsulation and data-hiding dictate that nonmember functions should not be able to nonmember functions should not be able to access an object’s private or protected data.access an object’s private or protected data.

Imagine you need a function to operate on Imagine you need a function to operate on objects of two different classes. Perhaps the objects of two different classes. Perhaps the function will take objects of the two classes function will take objects of the two classes as arguments, and operate on their private as arguments, and operate on their private data. data. In such satiation friend functions are used…In such satiation friend functions are used… Precisely, a friend function is one declared Precisely, a friend function is one declared

outside of classes and still operates on their outside of classes and still operates on their private data.private data.