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