C++多繼承
<上一節
下一節>
在前面所有的例子中,派生類都只有一個基類,我們成這種情況為單繼承。而在C++中一個派生類中允許有兩個及以上的基類,我們稱這種情況為多繼承。單繼承中派生類是對基類的特例化,例如前面中編程類書籍是書籍中的特例。而多繼承中,派生類是所有基類的一種組合。
例1:
在多繼承中,派生類繼承了所有基類中的所有成員變量和成員函數,這些繼承過來的成員變量及成員函數其訪問規則與單繼承是相同的,下面我們將例1中的teacher_cadre類中的所有成員及訪問屬性列于下表中。
使用多繼承可以描述事物之間的組合關系,但是如此一來也可能會增加命名沖突的可能性,沖突可能很有可能發生在基類與基類之間,基類與派生類之間。命名沖突是必須要解決的問題。
例2:
這個例子是一個非常極端的例子,只是為了說明命名沖突問題。我們來看一下例子,在本例中有三個類A、B和C,其中C類繼承自類A和類B。在三個類中我們都有一個成員變量,變量名恰好都為x,然后成員函數都名為setx和getx。由于兩個基類和派生類中出現了命名沖突,因此產生了遮蔽的情況。為了解決命名沖突問題我們只能采用域解析操作符來區分具體所調用的類中的成員函數。
例1:
class teacher { public: void settitle(char *a){title = a;} char * gettitle(){return title;} private: char * title; //職稱 }; class cadre { public: void setpost(char *a){post = a;} char * getpost(){return post;} private: char *post; //職務 }; class teacher_cadre: public cadre, public teacher { public: void setwages(int a){wages = a;} int getwages(){return wages;} private: int wages; //工資 };在本例中我們定義了三個類,一個是教師類,該類中有一個成員變量職稱title;另一個類是干部類,這個類中有一個成員變量職務post;最后定義了一個類teacher_cadre,這個類是cadre和teacher類的派生類,它也有一個新增的成員變量wages,表示工資。很明顯教職工干部teacher_cadre類是cadre類和teacher類的組合。
在多繼承中,派生類繼承了所有基類中的所有成員變量和成員函數,這些繼承過來的成員變量及成員函數其訪問規則與單繼承是相同的,下面我們將例1中的teacher_cadre類中的所有成員及訪問屬性列于下表中。
成員 | 屬性 | 來源 |
---|---|---|
title | 不可訪問 | teacher類 |
settitle | public | teacher類 |
gettitle | public | teacher類 |
post | 不可訪問 | cadre類 |
setpost | public | cadre類 |
getpost | public | cadre類 |
wages | private | teacher_cadre類新增 |
setwages | public | teacher_cadre類新增 |
getwages | public | teacher_cadre類新增 |
使用多繼承可以描述事物之間的組合關系,但是如此一來也可能會增加命名沖突的可能性,沖突可能很有可能發生在基類與基類之間,基類與派生類之間。命名沖突是必須要解決的問題。
例2:
#include <iostream> using namespace std; class A { public: void setx(int a){x = a;} int getx(){return x;} private: int x; }; class B { public: void setx(int a){x = a;} int getx(){return x;} private: int x; }; class C: public A, public B { public: void setx(int a){x = a;} int getx(){return x;} private: int x; }; int main() { C test; test.setx(10); test.B::setx(20); test.A::setx(30); return 0; }
這個例子是一個非常極端的例子,只是為了說明命名沖突問題。我們來看一下例子,在本例中有三個類A、B和C,其中C類繼承自類A和類B。在三個類中我們都有一個成員變量,變量名恰好都為x,然后成員函數都名為setx和getx。由于兩個基類和派生類中出現了命名沖突,因此產生了遮蔽的情況。為了解決命名沖突問題我們只能采用域解析操作符來區分具體所調用的類中的成員函數。
<上一節
下一節>