2012年(43)
分类: C/C++
2012-08-10 10:10:13
class Base
{
private:
int b_number;
public:
Base( ){}
Base(int i) : b_number (i) { }
int get_number( ) {return b_number;}
void print( ) {cout << b_number << endl;}
};
class Derived : public Base
{
private:
int d_number;
public:
// constructor, initializer used to initialize the base part of a Derived object.
Derived( int i, int j ) : Base(i), d_number(j) { };
// a new member function that overrides the print( ) function in Base
void print( )
{
cout << get_number( ) << " ";
// access number through get_number( )
cout << d_number << endl;
}
};
int main( )
{
Base a(2);
Derived b(3, 4);
cout << "a is ";
a.print( ); // print( ) in Base
cout << "b is ";
b.print( ); // print( ) in Derived
cout << "base part of b is ";
b.Base::print( ); // print( ) in Base
return 0;
}
没有虚析构函数,继承类没有析构
//Example: non- virtual destructors for dynamically allocated objects.
#include
#include
class Thing
{ public:
virtual void what_Am_I( ) {cout << "I am a Thing./n";}
~Thing(){cout<<"Thing destructor"<
class Animal : public Thing
{
public:
virtual void what_Am_I( ) {cout << "I am an Animal./n";}
~Animal(){cout<<"Animal destructor"<
void main( )
{
Thing *t =new Thing;
Animal*x = new Animal;
Thing* array[2];
array[0] = t; // base pointer
array[1] = x;
for (int i=0; i<2; i++) array->what_Am_I( ) ;
delete array[0];
delete array[1];
return ;
}
纯虚函数,多态
#include
#include
class Point
{
private:
double x;
double y;
public:
Point(double i, double j) : x(i), y(j) { }
void print( ) const
{ cout << "(" << x << ", " << y << ")"; }
};
class Figure
{
private:
Point center;
public:
Figure (double i = 0, double j = 0) : center(i, j) { }
Point& location( )
{
return center;
} // return an lvalue
void move(Point p)
{
center = p;
draw( );
}
virtual void draw( ) = 0; // draw the figure
virtual void rotate(double) = 0;
// rotate the figure by an angle
};
class Circle : public Figure
{
private:
double radius;
public:
Circle(double i = 0, double j = 0, double r = 0) : Figure(i, j), radius(r) { }
void draw( )
{
cout << "A circle with center ";
location( ).print( );
cout << " and radius " << radius << endl;
}
void rotate(double)
{
cout << "no effect./n";
} // must be defined
};
class Square : public Figure
{
private:
double side; // length of the side
double angle; // the angle between a side and the x-axis
public:
Square(double i = 0, double j = 0, double d = 0, double a = 0) : Figure(i, j), side(d), angle(a) { }
void draw( )
{
cout << "A square with center ";
location( ).print( );
cout << " side length " << side << "./n"
<< "The angle between one side and the X-axis is " << angle << endl;
}
void rotate(double a)
{
angle += a;
cout << "The angle between one side and the X-axis is " << angle << endl;
}
void vertices( )
{
cout << "The vertices of the square are:/n";
// calculate coordinates of the vertices of the square
}
};
int main( )
{
Circle c(1, 2, 3);
Square s(4, 5, 6);
Figure *f = &c, &g = s;
f -> draw( );
f -> move(Point(2, 2));
g.draw( );
g.rotate(1);
s.vertices( );
// Cannot use g here since vertices( ) is not a member of Figure.
return 0;
}
////////////////////////////////////////////////////////////////////
#include
#include
class Thing
{
public:
virtual void what_Am_I( ) {cout << "I am a Thing./n";}
~Thing(){cout<<"Thing destructor"<
class Animal : public Thing
{
public:
virtual void what_Am_I( ) {cout << "I am an Animal./n";}
~Animal(){cout<<"Animal destructor"<
void main( )
{
Thing t ;
Animal x ;
Thing* array[2];
array[0] = &t; // base pointer
array[1] = &x;
for (int i=0; i<2; i++) array->what_Am_I( ) ;
return ;
}
多继承
#include
class A
{
private:
int a;
public:
A(int i) : a(i) { }
virtual void print( ) {cout << a << endl;}
int get_a( ) {return a;}
};
class B
{
private:
int b;
public:
B(int j) : b(j) { }
void print( ) {cout << b << endl;}
int get_b( ) {return b;}
};
class C : public A, public B
{
int c;
public:
C(int i, int j, int k) : A(i), B(j), c(k) { }
void print( ) {A::print( ); B::print( );}
// use print( ) with scope resolution
void get_ab( ) {cout << get_a( ) << " " << get_b( ) << endl;}
// use get_a( ) and get_b( ) without scope resolution
};
int main( )
{
C x(5, 8, 10);
A* ap = &x;
B* bp = &x;
ap -> print( ); // use C::print( );
bp -> print( ); // use B::print( );
// bp -> A::print( ); // as if x is inherited from B only,
// cannot access A::print( );
x.A::print( ); // use A::print( );
x.get_ab( );
return 0;
}
共同基类的多继承
#include class A : public R class B : public R class C : public A, public B #include class R class A : public virtual R class B : public virtual R class C : public A, public B void main() #include class R
class R
{int r;
public:
R(int anInt){ r = anInt;};
printOn(){ cout<<"r="<
{
int a;
public:
A(int int1,int int2):R(int2){ a = int1;};};
{
int b;
public:
B(int int1,int int2):R(int2){ b = int1;};};
{
int c;
public:
C(int int1,int int2, int int3):A(int2,int3), B(int2,int3){ c = int1;}
};
int main( )
{
int i;
R rr(10);
A aa(20,30);
B bb (40,50);
C cc(5, 7, 9);
rr.printOn();
aa.printOn(); //inherits R printOn
bb.printOn(); //inherits R printOn
//cc.printOn(); //would give error
return 0;}
虚基类
{ int r;
public:
R (int x = 0) : r(x) { } // constructor in R
void f( ){ cout<<"r="<
{ int a;
public:
A (int x, int y) : R(x), a(y) { } // constructor in A
void f( ){ cout<<"a="<};
{int b;
public:
B(int x, int z) : R(x), b(z) { }// constructor in B
void f( ){ cout<<"b="<};
{ int c;
public:
// constructor in C, which constructs an R object first
C(int x, int y, int z, int w) : R(x), A(x, y), B(x, z), c(w) { }
void f( ){ cout<<"c="<
{ R rr(1000);
A aa(2222,444);
B bb(3333,111);
C cc(1212,345,123,45);
cc.printOn(); //uses R printOn but only 1 R..no ambiguity
cc.f(); // shows multiple call of the R::f()
}
////////////////////////////////////////
{ int r;
public:
R (int x = 0) : r(x) { } // constructor in R
void f( ){ cout<<"r="<