在C++中,继承是一个对象自动获取其父对象的所有属性和行为的过程。通过继承,您可以重用,扩展或修改在其他类中定义的属性和行为。通过继承,可以实现函数重写以及多态。
在C++中,继承另一个类的成员的类称为派生类,其成员被继承的类称为基类。 派生类是基类的子类。
继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。
C++最强大的功能之一就是派生类的使用。通过其类提供类和对象的更一般的属性和行为,通过派生类来逐步特殊化、具体化,体现出一种层次化的关系。既能达到代码重用,还可添加成员或重写成员函数。继承一般有三种形式1) 实现继承:派生类使用基类的属性和方法而无需额外编码;2) 可视继承:子窗体使用父窗体的外观和实现代码;3) 接口继承:仅使用属性和方法,实现滞后到子类实现;
如C++的输入输出流类就能会很地体现这种继承和派生的层次关系:
定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:
class derived-class: access-specifier base-class
其中,访问修饰符 access-specifier可以是 public、protected 或 private 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private。
实例:
#include using namespace std;// 基类class Shape{public:void setWidth(int w){width = w;}void setHeight(int h){height = h;}protected:int width;int height;};// 派生类class Rectangle: public Shape{public:int getArea(){return (width * height);}};int main(void){Rectangle Rect;Rect.setWidth(5);Rect.setHeight(7);// 输出对象的面积cout << "Total area: " << Rect.getArea() << endl;system("pause");return 0;}//输出:Total area: 35
1 访问控制和继承
派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。
我们可以根据访问权限总结出不同的访问类型,如下所示:
2 派生类不能继承的函数成员
一个派生类继承了所有的基类方法,但下列情况除外:
- 基类的构造函数、析构函数和拷贝构造函数。
- 基类的重载运算符。
- 基类的友元函数。
用派生的方法定义一个派生类时,派生类对象中的基类部分必须在构造函数的初始化列表中调用基类的构造函数完成,如:
#include
#include
//代码清单12-11 派生类定义实例car派生taxi
class car {
char no[10];
char owner[10];
char type[20];
public:
car(char *s1, char *s2, char *s3)
{
strcpy(no, s1);
strcpy(owner, s2);
strcpy(type, s3);
}
void modifyNo(char *s) {strcpy(no, s); }
void modifyOwner(char *s) {strcpy(owner, s); }
const char *getNo() const { return no; }
const char *getOwner() const {return owner; }
const char *getType() const { return type; }
};
class taxi : public car {
int seat;
double price;
public:
taxi(char *s1, char *s2, char *s3, int s, double p):car(s1,s2,s3)
{seat = s; price = p; }
double operator() (int start, int end)
{ return price *(end-start); }
int getSeat() const {return seat; }
double getPrice() const { return price; }
};
int main()
{
car car1("沪A01100