创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承一个已经存在的类。这个已经存在的类叫做基类,新建的类叫做派生类。
访问控制和继承
派生类可以访问基类中所有的非私有成员。有如下表所示:
访问 | public | protected | private |
---|---|---|---|
同一个类 | yes | yes | yes |
派生类 | yes | yes | no |
外部的类 | yes | no | no |
一个派生类继承了基类所有的方法,但是以下的除外:
- 基类的构造函数、析构函数和拷贝构造函数。
- 基类的重载运算符。
- 基类的友元函数。
继承类型
有public、protected、private三种继承类型。
公有继承(public):基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类中的方法来访问。
私有继承(private):基类的公有成员和保护成员成为派生类的私有成员。
保护继承(protected):基类的公有成员和保护成员成为派生类的保护成员。
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 10;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(4);
Rect.setHeight(9);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: %d" << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: %d" << Rect.getCost(area) << endl;
return 0;
}
输出结果是:
Total area: 36
Total paint cost: 360