C++继承
在面向对象的程序设计中有一种最重要的概念就是继承。继承允许我们在另一个类基础上,更容易地创建和定义一个类来维护应用程序。这还提供了一个好处,重用代码的功能。
当创建而不是完全写入新的数据成员和成员函数的类,程序员可以指定一个新的类要继承现有的类成员。这个现有的类叫做基类,新的类被称为派生类。
继承的想法实现的关系。例如,哺乳动物一种动物,狗是哺乳动物,因此狗就是一种动物等等。
基类和派生类:
类可以从一个以上的类中派生,这意味着它可以从多个基类继承数据和功能。定义一个派生类中,我们使用一个类派生列表来指定基类(ES)。类派生列表名称的一个或多个基类,具有下列形式:
class derived-class: access-specifier base-class
在那里访问指定符是public, protected, 或private 之一, 基类是之前定义的类的名称。如果不使用所述接入指示符,那么它默认是private。
考虑一个基类Shape和它的派生类Rectangle,如下所示:
#include <iostream> using namespace std; // Base class class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Derived class class Rectangle: public Shape { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); // Print the area of the object. cout << "Total area: " << Rect.getArea() << endl; return 0; }
让我们编译和运行上面的程序,这将产生以下结果:
Total area: 35
访问控制和继承:
派生类可以访问其基类的所有非私有成员。因此,基类成员不应该访问的派生类的成员函数应声明为private基类。
我们可以根据按需访问它们以下列方式概括不同接入类型:
访问 | public | protected | private |
---|---|---|---|
同一类内 | yes | yes | yes |
派生类 | yes | yes | no |
外部类 | yes | no | no |
派生类继承了所有基类的方法,以下情况除外:
-
构造函数,析构函数和基类的拷贝构造函数
-
基类的重载运算符
-
基类的友元函数
继承类型:
当派生类从基类继承,基础类可以通过public, protected 或 private继承。继承类型是由存取指示符指定为如上所述。
我们几乎不使用保护或私有继承,但公有继承是常用的。同时使用不同类型的继承,应用下面的规则:
-
公共继承:当从一个公共基类派生类,基类的公有成员成为派生类的公共成员和基类的成为派生类的保护成员保护成员。基类的私有成员是从不直接从派生类访问,但可以通过调用基类的公共和保护成员进行访问。
-
保护继承:当从一个受保护的基类派生,该基类的公共和受保护成员成为派生类的protected成员。
-
私有继承:从私有基类派生,该基类的公共和受保护成员成为派生类的私有成员。
多继承:
C++类可以从多个类继承成员,这里是扩展语法:
class derived-class: access baseA, access baseB....
其中,访问public, protected, or private基类将使用逗号将它们分开如上所示。让我们试试下面的例子:
#include <iostream> using namespace std; // Base class Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Base class PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // Derived class class Rectangle: public Shape, public PaintCost { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // Print the area of the object. cout << "Total area: " << Rect.getArea() << endl; // Print the total cost of painting cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; }
让我们编译和运行上面的程序,这将产生以下结果:
Total area: 35 Total paint cost: $2450