簡單繼承
繼承是C++的特性,它可以建立一個類,繼承一個已知的類,衍生類別自動擁有了基類的成員。繼承的形式如下:
class derived_class_name: public base_class_name
{ /*...*/ };
其中public表示繼承方式,可以替代為protected和private,如果省略繼承方式,對'class'將採用私人繼承,對'struct'將採用公有繼承。
範例程式碼如下:
// derived classes
#include <iostream>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
class CRectangle: public CPolygon {
public:
int area ()
{ return (width * height); }
};
class CTriangle: public CPolygon {
public:
int area ()
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
cout << rect.area() << endl;
cout << trgl.area() << endl;
return 0;
}
protected修飾符類似private,唯一不同是,繼承的時候,當一個類從另一個類繼承,衍生類別中的成員可以訪問受保護的從基類繼承的成員,但不是它的私人成員。
根據訪問方式,我們可以總結出下面的訪問類型:
Access |
public |
protected |
private |
members of the same class |
yes |
yes |
yes |
members of derived classes |
yes |
yes |
no |
not members |
yes |
no |
no |
三種繼承方式
之前提到繼承方式,分別有:公有繼承(public)、私人繼承(private)、保護繼承(protected)。
1. 公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作為衍生類別的成員時,它們都保持原有的狀態,而基類的私人成員仍然是私人的,不能被這個衍生類別的子類所訪問。
2. 私人繼承(private)
私人繼承的特點是基類的公有成員和保護成員都作為衍生類別的私人成員,並且不能被這個衍生類別的子類所訪問。
3. 保護繼承(protected)
保護繼承的特點是基類的所有公有成員和保護成員都成為衍生類別的保護成員,並且只能被它的衍生類別成員函數或友元訪問,基類的私人成員仍然是私人的。
繼承的成員
原則上,衍生類別不會繼承基類的以下成員:
1.基類的構造和解構函式
2.基類的=()成員函數
3.基類的友元
雖然基類的建構函式和解構函式沒有被繼承,一個衍生類別的新對象被建立或銷毀時總是會調用基類的預設建構函式(即,它不帶參數的建構函式)和它的解構函式。
如果基類沒有預設建構函式,一個重載的建構函式被調用建立一個新的派生對象時,您可以在每個衍生類別的建構函式中定義:
derived_constructor_name (parameters) : base_constructor_name (parameters) {...}
例如:
// constructors and derived classes
#include <iostream>
using namespace std;
class mother {
public:
mother ()
{ cout << "mother: no parameters\n"; }
mother (int a)
{ cout << "mother: int parameter\n"; }
};
class daughter : public mother {
public:
daughter (int a)
{ cout << "daughter: int parameter\n\n"; }
};
class son : public mother {
public:
son (int a) : mother (a)
{ cout << "son: int parameter\n\n"; }
};
int main () {
daughter cynthia (0);
son daniel(0);
return 0;
}
多繼承
C++支援一個類繼承多個類,例如
class CRectangle: public CPolygon, public COutput;
class CTriangle: public CPolygon, public COutput;
完整例子如下:
// multiple inheritance
#include <iostream>
using namespace std;
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b;}
};
class COutput {
public:
void output (int i);
};
void COutput::output (int i) {
cout << i << endl;
}
class CRectangle: public CPolygon, public COutput {
public:
int area ()
{ return (width * height); }
};
class CTriangle: public CPolygon, public COutput {
public:
int area ()
{ return (width * height / 2); }
};
int main () {
CRectangle rect;
CTriangle trgl;
rect.set_values (4,5);
trgl.set_values (4,5);
rect.output (rect.area());
trgl.output (trgl.area());
return 0;
}