CHAPTER 10 Inheritance 继承

Post on 16-Mar-2016

160 views 2 download

description

CHAPTER 10 Inheritance 继承. Introduction - PowerPoint PPT Presentation

Transcript of CHAPTER 10 Inheritance 继承

CHAPTER 10 Inheritance 继承

IntroductionA key feature of an object-oriented language in inheritance. Inheritance is t

he ability to define new classes using existing classes as a basis. The new c

lass inherits the attributes and behaviors of the classes on which it is based,

and it can also have attributes and behaviors that are specific to it.

继承是面向对象语言的重要特征之一。继承是把已有类作为基类定义新的类。这个新的类继承了基类的属性和操作,而且还可以具有自己特定的属性和操作。

Three relationships are commonly used in object-oriented design :

• is-a relationships

Hierarchy relationship. It specifies that one abstraction is a specialization

of another.

• has-a relationships

Contain relationship. Some object is part of another.

• uses-a relationships

One object uses another object in some way.

10.1 OBJECT-ORIENTED DESIGN USING INHERITANCE

is-a relationships

AA

B1B1 B2B2

C1C1 C2C2 C3C3

Base class of B1 and B2

Derived class of ABase class of C1, C2 and C3

Derived class of ABase class of C3

Derived class of B1 and B2Multiple inheritance

Derived class of B1

has-a relationships

class A { … B DMiB DMi … FM} ;

class BB { … DM … FM} ;

uses-a relationships

class A { … DM … FMj ( B &B & … )} ;

class BB { … DM … FM} ;

class DerivedClass : public BaseClass {

public :

// public section

private :

// private section

} ;

10.3.1 Declaring a derived class

class DerivedClass : public BaseClass {

public :

// public section

private :

// private section

} ;

10.3.1 Declaring a derived class

Derived class name

class DerivedClass : public BaseClass {

public :

// public section

private :

// private section

} ;

10.3.1 Declaring a derived class

Access specifier(usually public)

class DerivedClass : public BaseClass {

public :

// public section

private :

// private section

} ;

10.3.1 Declaring a derived class

Class name of base class

Declare vehicle class and derived class car :class vehiclevehicle { public : void initialize (int in_wheels , float in_weight ) ; int get_wheels ( ) ; float get_weight ( ) ; float get_loading ( ) ; private : int wheels ; float weight ; float loading ;} ;class carcar : public vehiclevehicle { public : void initialize ( int in_wheels , float in_weight , int people = 4 ) ; int passengers ( ) ; private : int passenger_load ;} ;

Example

The syntax for the constructor of derived class isThe syntax for the constructor of derived class is

10.3.2 Implementing a derived class

DClass :: DClass ( Plist ) : BClass ( Plist ) , DMbrList {

// Body of derived class constructor…

}

The syntax for the constructor of derived class isThe syntax for the constructor of derived class is

10.3.2 Implementing a derived class

DClass :: DClass ( Plist ) : BClass ( Plist ) , DMbrList {

// Body of derived class constructor…

}Derived class name

The syntax for the constructor of derived class isThe syntax for the constructor of derived class is

10.3.2 Implementing a derived class

DClass :: DClass ( Plist ) : BClass ( Plist ) , DMbrList {

// Body of derived class constructor…

}Derived class constructor

parameter list

The syntax for the constructor of derived class isThe syntax for the constructor of derived class is

10.3.2 Implementing a derived class

DClass :: DClass ( Plist ) : BClass ( Plist ) , DMbrList {

// Body of derived class constructor…

}Base class name

The syntax for the constructor of derived class isThe syntax for the constructor of derived class is

10.3.2 Implementing a derived class

DClass :: DClass ( Plist ) : BClass ( Plist ) , DMbrList {

// Body of derived class constructor…

}Base class constructor

parameter list

The syntax for the constructor of derived class isThe syntax for the constructor of derived class is

10.3.2 Implementing a derived class

DClass :: DClass ( Plist ) : BClass ( Plist ) , DMbrList {

// Body of derived class constructor…

} Class data member initialization list

The syntax for the constructor of derived class isThe syntax for the constructor of derived class is

10.3.2 Implementing a derived class

DClass :: DClass ( Plist ) : BClass ( Plist ) , DMbrList {

// Body of derived class constructor…

}

• First base classFirst base class

• Second class data memberSecond class data member

• Last derived classLast derived class

// Example13-1#include < iostream.h >class Base{ public : Base ( ) { cout << "\nBase created.\n" ; }} ;class D_class : public Base{ public : D_class ( ) { cout << "D_class created.\n" ; }} ;void main (){ D_class d1 ; }

Output Base created.

D_class created.

// Example13-2

#include <iostream.h>

class parent_class

{ int private1 , private2 ;

public :

parent_class ( int p1 , int p2int p1 , int p2 ) { private1 = p1; private2 = p2; }

int inc1 ( ) { return ++private1; }

int inc2 ( ) { return ++private2 ; }

void display ( )

{ cout << "private1=" << private1 << " , private2=" << private2 << endl ; }

};

Base class constructor parameter list

class derived_class : private parent_class{ int private3 ; parent_class private4 ; // Class data member public: derived_class ( int p1 , int p2 , int p3 , int p4 , int p5 )

: parent_class ( p1 , p2 ) , private4 ( p3 , p4 ) { private3 = p5 ; } int inc1 ( ) { return parent_class :: inc1 ( ) ; } int inc3 ( ) { return ++private3 ; } void display ( ) { parent_class :: display ( ) ; private4 . display ( ) ; cout << "private3=" << private3 << endl ; }} ;void main ( ){ derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;}

Five parameters of derived class constructor

class derived_class : private parent_class{ int private3 ; parent_class private4 ; // Class data member public: derived_class ( ( int p1 , int p2int p1 , int p2 , int p3 , int p4 , int p5 )

: parent_class ( p1 , p2 )parent_class ( p1 , p2 ) , private4 ( p3 , p4 ) { private3 = p5 ; } int inc1 ( ) { return parent_class :: inc1 ( ) ; } int inc3 ( ) { return ++private3 ; } void display ( ) { parent_class :: display ( ) ; private4 . display ( ) ; cout << "private3=" << private3 << endl ; }} ;void main ( ){ derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;}

For base classparent_class(p1,p2)

Initialize private1 and private2

class derived_class : private parent_class{ int private3 ; parent_class private4 ; // Class data member public: derived_class ( ( int p1 , int p2int p1 , int p2 , int p3 , int p4 ,int p3 , int p4 , int p5 )

: parent_class ( p1 , p2 )parent_class ( p1 , p2 ) , private4 ( p3 , p4 )private4 ( p3 , p4 ) { private3 = p5 ; } int inc1 ( ) { return parent_class :: inc1 ( ) ; } int inc3 ( ) { return ++private3 ; } void display ( ) { parent_class :: display ( ) ; private4 . display ( ) ; cout << "private3=" << private3 << endl ; }} ;void main ( ){ derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;}

For class member private4 parent_class(p1,p2) : initialize

private4.private1 and private4.private2

class derived_class : private parent_class{ int private3 ; parent_class private4 ; // Class data member public: derived_class ( ( int p1 , int p2int p1 , int p2 , int p3 , int p4 ,int p3 , int p4 , int p5int p5 )

: parent_class ( p1 , p2 )parent_class ( p1 , p2 ) , private4 ( p3 , p4 )private4 ( p3 , p4 ) { private3 = p5private3 = p5 ; } int inc1 ( ) { return parent_class :: inc1 ( ) ; } int inc3 ( ) { return ++private3 ; } void display ( ) { parent_class :: display ( ) ; private4 . parent_class :: display ( ) ; cout << "private3=" << private3 << endl ; }} ;void main ( ){ derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;}

For derived class Initialize data member private3

class derived_class : private parent_class{ int private3 ; parent_class private4 ; // Class data member public: derived_class ( ( int p1 , int p2int p1 , int p2 , int p3 , int p4 ,int p3 , int p4 , int p5int p5 )

: parent_class ( p1 , p2 )parent_class ( p1 , p2 ) , private4 ( p3 , p4 )private4 ( p3 , p4 ) { private3 = p5private3 = p5 ; } int inc1 ( ) { return parent_class :: inc1 ( ) ; } int inc3 ( ) { return ++private3 ; } void display ( ) { parent_class :: display ( ) ; private4 . parent_class :: display ( ) ; cout << "private3=" << private3 << endl ; }} ;void main ( ){ derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;}

Output

private1 = 18 , private2 = 18

private1 = 1 , private2 = 2

private3 = -5

• Data members and member functions can be cover in the derived class.

• The derived class member functions do not access to the private member

of base class.

10.4 PROTECTED MEMBERS AND INHERITANCE

保护成员与继承

Exampleclass base{ public : int a , bb ; };class derived : public base { public : int bb , c ; } ;void f ( ){ derived d ; d . a = 1 ; d . base :: bbase :: b = 2 ; // use member b of base class d . bb = 3 ; // use member b of derived class d . c = 4 ;};

Exampleclass X{ public : void get_ij ( ) ; void put_ij ( ) ; private : int i , jprivate : int i , j ;};class Y : public X{ public : int get_k ( ) ; void make_k ( ) ; private : int k ;};void Y :: make_k ( ) ;{ k = i * ji * j ; // illegal } ;

Exampleclass X{ public : void get_ij ( ) ; void put_ij ( ) ; private : int i , jprivate : int i , j ;};class Y : public X{ public : int get_k ( ) ; void make_k ( ) ; private : int k ;};void Y :: make_k ( ) ;{ k = i * ji * j ; // illegal } ;

protected : int i , jprotected : int i , j ;

k = i * ji * j ; // legal

10.5 CONTROLLING INHERITANCE 控制继承 10.5.1 Public Inheritance 公有继承

class DerivedClass : public BaseClass {

public :

// public section

private :

// private section

} ;

The public members and protected

members keep their character in

derived class.

// Example13-3#include<iostream.h>class XX { public : void get_ij( ) { cout << "Enter two numbers:" ; cin >> i >> j ; }; void put_ij( ) { cout << i << " " << j << '\n' ; }; protected : int i , j ;};class YY : public X { public : int get_k( ) { return k ; }; void make_k( ) { k = i i * jj ; }; // use base class DM private : int k ;};class ZZ : public Y { public : void f( ) { ii = 2 ; jj = 3; }; // use base class DM};void main ( ){ Y var1Y var1; Z var2Z var2 ; var1var1.get_ij( )get_ij( ) ; var1var1.put_ij( )put_ij( ) ; var1.make_k( ) ; var2.f( ) ; var2var2.put_ij( )put_ij( ) ;}

class X

class Y

class Z

10.5.2 Private inheritance 私有继承

class DerivedClass : private BaseClass {

public :

// public section

private :

// private section

} ;

The public members and protected

members of base class are private

member in derived class.

// Example13-4#include<iostream.h>class XX { public : void get_ij( ) { cout << "Enter two numbers:" ; cin >> i >> j ; }; void put_ij( ) { cout << i << " " << j << '\n' ; }; protected : int i , j ;};class YY : public X { public : int get_k( ) { return k ; }; void make_k( ) { k = i i * jj ; }; // use base class DM private : int k ;};class ZZ : public Y { public : void f( ) { ii = 2 ; jj = 3; }; // use base class DM};void main ( ){ Y var1Y var1; Z var2Z var2 ; var1var1.get_ij( )get_ij( ) ; var1var1.put_ij( )put_ij( ) ; var1.make_k( ) ; var2.f( ) ; var2var2.put_ij( )put_ij( ) ;}

// Example13-4#include<iostream.h>class XX { public : void get_ij( ) { cout << "Enter two numbers:" ; cin >> i >> j ; }; void put_ij( ) { cout << i << " " << j << '\n' ; }; protected : int i , j ;};class YY : privateprivate X { public : int get_k( ) { return k ; }; void make_k( ) { k = i i * jj ; }; // use base class DM private : int k ;};class ZZ : public Y { public : void f( ) { ii = 2 ; jj = 3; }; // use base class DM};void main ( ){ Y var1Y var1; Z var2Z var2 ; var1var1.get_ij( )get_ij( ) ; var1var1.put_ij( )put_ij( ) ; var1.make_k( ) ; var2.f( ) ; var2var2.put_ij( )put_ij( ) ;}

class X

class Y

class Z

private

public

OK i, j are private member in Y class

// Example13-4#include<iostream.h>class XX { public : void get_ij( ) { cout << "Enter two numbers:" ; cin >> i >> j ; }; void put_ij( ) { cout << i << " " << j << '\n' ; }; protected : int i , j ;};class YY : privateprivate X { public : int get_k( ) { return k ; }; void make_k( ) { k = i i * jj ; }; // use base class DM private : int k ;};class ZZ : public Y { public : void f( ) { ii = 2 ; jj = 3; }; // use base class DM};void main ( ){ Y var1Y var1; Z var2Z var2 ; var1var1.get_ij( )get_ij( ) ; var1var1.put_ij( )put_ij( ) ; var1.make_k( ) ; var2.f( ) ; var2var2.put_ij( )put_ij( ) ;}

class X

class Y

class Z

private

public

Illegal Illegal Can not access private member of

base class

// Example13-4#include<iostream.h>class XX { public : void get_ij( ) { cout << "Enter two numbers:" ; cin >> i >> j ; }; void put_ij( ) { cout << i << " " << j << '\n' ; }; protected : int i , j ;};class YY : privateprivate X { public : int get_k( ) { return k ; }; void make_k( ) { k = i i * jj ; }; // use base class DM private : int k ;};class ZZ : public Y { public : void f( ) { ii = 2 ; jj = 3; }; // use base class DM};void main ( ){ Y var1Y var1; Z var2Z var2 ; var1var1.get_ij( )get_ij( ) ; var1var1.put_ij( )put_ij( ) ; var1.make_k( ) ; var2.f( ) ; var2var2.put_ij( )put_ij( ) ;}

class X

class Y

class Z

private

public

Illegal Illegal main() can not call private MF of

any objects

10.5.3 Protected inheritance 保护继承

class DerivedClass : protected BaseClass {

public :

// public section

private :

// private section

} ;

The public members and protected

members of base class are protected

member in derived class.

Protected inheritance is used rarely.

Inheritance Type Base Class Member Access

Derived Class Member Access

public publicprotectedprivate

publicprotectedinaccessible

protected publicprotectedprivate

protectedprotectedinaccessible

private publicprotectedprivate

privateprivateinaccessible

Do you know Do you know how access x, y and zhow access x, y and z

public : x class A protected : y

private : z

Such as : main()

Common functions

class B : public A

Derived

class C : private A

Derived

A derived class can inherit from two or more base class.

10.6 MULTIPLE INHERITANCE 多继承

class C : public A , public B

class A class B

A derived class can inherit from two or more base class.

10.6 MULTIPLE INHERITANCE 多继承

The syntax for declaring a class derived using multiple inheritance is

class DClass : publicpublic BClassBClass, , publicpublic BClassBClass {

public :// public section …

private :// private section…

} ;

// Example13-4#include<iostream.h>class A { public : void setA ( int x ) { a = x ; } ; void showA( ) { cout << a << endl ; } ; private : int a ;} ;class B { public : void setB ( int x ) { b = x ; } ; void showB ( ) { cout << b << endl ; } ; private : int b ;} ;class C : public Apublic A , private Bprivate B { public : void setC ( int x , int y , int z ) { setA ( x ) ; setB ( y ) ; c = z ; } ; void showC ( ) { showA ( ) ; showB ( ) ; cout << c << endl ; } ; private : int c ;} ;void main ( ) { C obj ; obj . setA ( 5 ) ; obj . showA ( ) ; obj . setC ( 6 , 7 , 9 ) ; obj . showC ( ) ; //obj . setB ( 6 ) ;//obj . setB ( 6 ) ; // error, private inheritance //obj . showB ( ) ;//obj . showB ( ) ; // error}

class A class B

class C

• If a derived class be derived from multiple base classes, and these base

have a common base class, then, when access members of this common

base class may be open to different interpretations.

10.7 VIRTUAL BASE CLASS

Example

class B { public : int b ;} ;

class B1 : public B { private : int b1 ; } ;

class B2 : public B { private : int b2 ; } ;

class C : public B1 , public B2

{ public : int f ( ) ; private : int d ; } ;

C c ;

c . bc . b // error

c . B :: bc . B :: b // error , where from?

c . B1 :: b // ok , from B1

c . B2 :: b // ok , from B2

class C { f () , d }

class B1 { b1 } class B2 {b2}

class B { b } class B { b }

// Example13-5

#include<iostream.h>

class B{public: int b;};

class B1:public B {public: int b1;};

class B2:public B {public: int b2;};

class C:public B1, public B2 {public: f(); private: int b1;};

void main()

{ C c;

c.B1::b=5;

c.B2::b=10;

cout<<"path B1==>"<<c.B1::b<<endl;

cout<<"path B2==>"<<c.B2::b<<endl;

}

Output:

path B1==> 5

path B2==> 10

class C { f () , d }

class B1 { b1 } class B2 {b2}

class B { b } class B { b }

b

b1

b

b2

d

B

B

B1

B2C

Store of multiple derived class object C

When create object C, constructor of B is called two times. Once for B1,Others for B2. A C object contains two sub-object of B.

class C { f () , d }

class B1 { b1 } class B2 {b2}

class B { b } class B { b }Example

class B { public : int b ;} ;

class B1 : public B { private : int b1 ; } ;

class B2 : public B { private : int b2 ; } ;

class C : public B1 , public B2

{ public : int f ( ) ; private : int d ; } ;

• If a derived class be derived from multiple base classes, and these base

have a common base class, then, when access members of this common

base class may be open to different interpretations.

10.7 VIRTUAL BASE CLASS

• For produce only one sub-object in deriver class object, the base classes

must be declared virtual inheritance the common base class.

Key word virtual

Exampleclass B { public : int b ;} ;

class B1 : virtualvirtual public B { private : int b1 ; } ;

class B2 : virtualvirtual public B { private : int b2 ; } ;

class C : public B1 , public B2

{ private : float d ; } ;

As:C cc ;cc . bcc . b // OK

class C { d }

class B1 { b1} class B2 {b2}

class B { b }

cc . B1 :: b and cc . B2 :: b is same sub-object of class B

Store of object C using virtual inheritance

b1

b2

d

b BB

B1B1

B2B2CC

class C { d }

class B1 { b1} class B2 {b2}

class B { b }Exampleclass B { public : int b ;} ;

class B1 : virtualvirtual public B { private : int b1 ; } ;

class B2 : virtualvirtual public B { private : int b2 ; } ;

class C : public B1 , public B2

{ private : float d ; } ;

• If a derived class be derived from multiple base classes, and these base

have a common base class, then, when access members of this common

base class may be open to different interpretations.

10.7 VIRTUAL BASE CLASS

• For produce only one sub-object in deriver class object, the base classes

must be declared virtual inheritance the common base class.

• Using virtual inheritance, the constructor of common base class is called

only once.

// Example13-6#include < iostream.h >class A{ public : A ( ) { cout << "class A" << endl ; } } ;class B : virtual public A{ public : B ( ) {cout << "class B" << endl ; } } ;class C : virtual public A{ public : C ( ) {cout << "class C" << endl ; } } ;class D : public B , public C{ public : D ( ) {cout << "class D" << endl ; } } ;void main ( ){ D dd ; }

Output class Aclass Bclass Cclass D

// Example13-7#include < iostream.h >class A{ public : A ( ) { cout << "class A" << endl ; } } ;class B : /*virtual*/ public A{ public : B ( ) {cout << "class B" << endl ; } } ;class C : /*virtual*/ public A{ public : C ( ) {cout << "class C" << endl ; } } ;class D : public B , public C{ public : D ( ) {cout << "class D" << endl ; } } ;void main ( ){ D dd ; } Output class A

class Bclass Aclass Cclass D

• Each object of a class has its own copy of all data members of the class.

In certain cases only one copy of a variable should be share by all objects

of a class. A static class variable is used for these and other reasons.

• The declaration of a static member begins with the keyword static.

10.8 STATIC CLASS MEMBERS 静态类成员

• Static data members have class scope.

• Static data members must be initialized once (and only once) at file

scope.

• A class’s public static data members can be accessed through any object

of that class.

• A class’s private and protected static data members must be accessed

through public member functions of the class or through friends of the

class.

10.8.1 Static data members 静态数据成员

class object { char ch ; static s ; …... };

object A , B , C , D ;

object B

char ch ;

object C

char ch ;

object D

char ch ;

ExampleExample

object A static s ;static s ;

char ch ;

// Example13-8#include<iostream.h>class counter{ static int num1 ;static int num1 ; public : void setnum1 ( int i ) { num1 = i ; } void shownum1 ( ) { cout << num1 << " " ; } static int num2 ;static int num2 ;} ;int counter :: num1 = 0 ;int counter :: num1 = 0 ; // initial 0 can default int counter :: num2 = 5;int counter :: num2 = 5;void main ( ){ counter a , b ; cout<<"private static DM : \n" ; a . shownum1 ( ) ; b . shownum1 ( ) ; a . setnum1 ( 10 ) ; a . shownum1 ( ) ; b . shownum1 ( ) ; // cout<<counter::num1;// cout<<counter::num1; //error, can not access num1 cout<<“\n public static DM :\n "<< counter :: num2counter :: num2 <<endl;}

// Example13-9 count the number of object# include < iostream.h >class counter{ static int num ; public : counter ( ) { cout << ++ num <<'\t' ; } ~counter( ) { cout << num -- <<'\t' ; } } ;int counter :: num = 0 ;void main ( ){ counter a , b , c ; cout<<endl;}

Output

1 2 3

3 2 1

• Static member functions access static member only.

• Static member functions have no this pointer.

10.8.2 Static member functions 静态成员函数

10.8.2 Static member functions 静态成员函数 Example class X{ int member ; public : static void func ( int i , X * ptr ) ;static void func ( int i , X * ptr ) ; }:

void g ( ){ X obj ; X :: func ( 1, & obj ) ;X :: func ( 1, & obj ) ; // OK obj . func ( 1 , & obj ) ;obj . func ( 1 , & obj ) ; // OK}

10.8.2 Static member functions 静态成员函数 Example class X{ int member ; public : static void func ( int i , X * ptr ) ;static void func ( int i , X * ptr ) ; }:

void X :: func ( int i ; X * ptr )

{ member = i ; // Error , whose member ? ptr -> member = i ;ptr -> member = i ; // OK

}

10.8.2 Static member functions 静态成员函数 Example class X{ int member ; public : static void func ( int i ,static void func ( int i , X aX a ) ;) ; }:

void X :: func ( int i ; void X :: func ( int i ; X aX a ) )

{ { cout << member ;cout << member ; // error, can not access non static member

cout << a . member ;cout << a . member ; // OK, pass parameter

}}

// Example13-10 count goods#include<iostream.h>class Goods { public : static int totalWeight ;static int totalWeight ; Goods ( int w) { weight = w; totalWeight += w ; } ; ~ Goods ( ) { totalWeight -= weight ; } ; int Weight ( ) { return weight ; } ; static int TotalWeight ( ) { return totalWeight ; } ; private : int weight ;} ;int Goods :: totalWeight = 0 ;int Goods :: totalWeight = 0 ;void main ( ){ int w ; cin >> w ; Goods * g1 = new Goods ( w ) ; cin >> w ; Goods * g2 = new Goods ( w ) ; cout << Goods :: TotalWeight ( ) << endl ; delete g2 ; cout << Goods :: TotalWeight ( ) << endl ;}

• A friend function of a class is defined outside that class’s scope.

• Friend functions have right access private members of the class.

• A function or an entire class may be declared to be a friend of another

class.

• Friendship is neither symmetric nor transitive.

10.9 FRIEND FUNCTION AND FRIEND CLASS

10.9 FRIEND FUNCTION AND FRIEND CLASS

Example

class X

{ int i ;

friend void func ( X * , int ) ; // func is friend of X

void member_func ( int ) ;

};

…...

void func ( X * xptr , int a )

{ xptr -> i = a ; }; // access private member

void X :: member_func ( int a )

{ i = a ; };

Example

class X

{ int i ;

friend void func ( X * , int ) ; // func is friend of X

void member_func ( int ) ;

};

// Example13-11 Count Distance#include<iostream.h>#include<math.h>class Point { public : Point ( double xi , double yi ) { X = xi ; Y = yi ; } double GetX( ) { return X ; } double GetY( ) { return Y ; } friend double Distance ( Point & a , Point & b ) ;friend double Distance ( Point & a , Point & b ) ; private : double X , Y ;} ;double Distance ( Point & a , Point & b )double Distance ( Point & a , Point & b ) { double dx = a.X - b.X ; // access private data members double dy = a.Y - b.Y ; return sqrt ( dx * dx + dy * dy ) ;}void main ( ) { Point p1 ( 3.0 , 5.0 ) , p2 ( 4.0 , 6.0 ) ; double d = Distance ( p1 , p2 ) ; cout << "This distance is " << d << endl ;}

// Example13-12 Friend Class#include<iostream.h>class A { friend class B ;friend class B ; // class B is friend of class A public: void Display ( ) { cout << x << endl ; }; private : int x ;};class Bclass B{ public: void Set ( int i ) { a . xa . x = i ; } ; // access private DM of a void Display ( ) { a. Display ( ) ; } ; private: A aA a ;} ;

void main ( ){ B b; b . Set ( 100 ) ; b . Display ( ) ; }<< endl ;}