继承是面向对象程序设计中软件重用的关键技术。继承机制使用已定义的类作为基础建立新的类定义,新的类是原有类的数据及操作与新类所增加的数据及操作的组合。新的类把原有的类作为基类引用,而不需要修改原有类的定义。新的类作为派生类引用。这种可扩充、可重用技术大大降低了大型软件的开发难度。
C++中描述类继承关系的语句格式为
class 派生类名 : 基类名表
{
数据成员和成员函数说明
}
其中,基类名表的语句格式如下
访问控制 基类名1,访问控制 基类名2,。。。,访问控制 基类名n
用于表示当前定义的派生类的各个基类。如果一个基类名表中只有一个基类,则表示定义的派生类只有一个基类,称为单继承;如果一个基类名表中有多个基类,则称为多继承
访问控制是表示继承权限的关键字,称为访问描述符。可以是
public 公有继承
private 私有继承
protected 保护继承
如果省略访问描述符,则C++认为是私有继承,其中,公有继承是最为常用的继承方式
一个派生类公有继承一个基类时,基类中所有公有成员(由public定义的数据成员或成员函数)成为派生类的共有成员,基类中所有的保护成员成为派生类的保护成员。
例程
class A
{
public :
void get_XY()
{
cout<<"Enter two numbers of x,y";
cin>>x>>y;
}
void put_XY()
{
cout<<"x="<<x<<",y="<<'\n';
}
protected:
int x,y;
};
class B:public A
{
public :
int get_S()
{return s;}
void make_S()
{s =x * y;}
protected:
int s;
};
基类的初始化
构造函数名(变元表):基类(变元表),数据成员1(变元表),。。。,数据成员n(变元表)
{}
例程
class Point
{
public:
Point (double t1,double t2)
{
x= t1;
y=t2;
}
void OutPoint()
{cout<<"Point:x="<<x<<"y="<<y<<endl;}
protected:
double x,y;
};
class Circle : public Point
{
public:
Circle (double t1,double t2,double t3)
:Point(t1,t2)
{radius = t3;}
void OutCircle()
{Point :: OutPoint();
cout<<""radius="}
}
重名成员
C++允许派生类的成员与基类成员重名。派生类中访问重名成员时,屏蔽基类的同名成员,如果要在派生类中使用基类的同名成员,可以显式地使用作用域符指定,格式如下:
类名::成员
派生类中访问静态成员
如果在基类中定义了静态成员,这些静态成员将在整个类体系中被共享,根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质
例程
#include<iostream>
using namespace std;
class B
{
public :
static void Add()
{i++;}
static int i;
void out()
{cout<<"static i = "<<i<<endl;}
};
int B::i = 0;
class D:private B
{
public :
void f();
};
void D::f()
{
i=5;
Add();
B::i++;
B::Add();
}
int main()
{
B x;
D y;
x.Add();
x.out();
y.f();
cout<<"static i = "<<B::i<<endl;
cout<<"static i = "<<x.i<<endl;
//cout<<"static i="<<y.i<<endl;
}
程序运行结果:
static i=1
static i=8
static i=8