上海網(wǎng)站建設(shè)專業(yè)公司自然搜索優(yōu)化
C++繼承的定義
兩個(gè)類的繼承關(guān)系在派生類中聲明,派生類定義使用以下語(yǔ)法:
class DerivedClass: [ACCESS] BaseClass{
/…/
};
冒號(hào)(:)后的[ACCESS]是繼承的最高權(quán)限級(jí)別符,可以是以下三個(gè)值(存取權(quán)限級(jí)別)的其中之一:
public,公共權(quán)限,三級(jí)(高)
protected,保護(hù)權(quán)限,二級(jí)
private,私有權(quán)限,一級(jí)(低)
由[ACCESS]的這三個(gè)值,從而引出了C++繼承的三種方式:
1、公共繼承,[ACCESS]是public
2、保護(hù)繼承,[ACCESS]是protected
3、私有繼承,[ACCESS]是private
首先明確一點(diǎn):基類BaseClass的private成員,在派生類DerivedClass中是無(wú)法訪問(wèn),即不能被繼承。
最高權(quán)限級(jí)別符[ACCESS]
最高權(quán)限級(jí)別符[ACCESS]的意思是:
在派生類DerivedClass中,繼承自基類BaseClass的成員的級(jí)別,高于[ACCESS]級(jí)別的都將被視為[ACCESS]級(jí)別;等于、低于[ACCESS]級(jí)別的,原樣不動(dòng)?;怋aseClass的private成員不被繼承。
C++繼承的三種方式詳解如下:
一、公共繼承,[ACCESS]是public
[ACCESS]為public時(shí),基類BaseClass的成員級(jí)別在派生類DerivedClass中都不變,即public的繼續(xù)是public、protected的繼續(xù)是protected,private不被繼承。
二、保護(hù)繼承,[ACCESS]是protected
[ACCESS]為protected時(shí),在派生類DerivedClass中,基類BaseClass的成員級(jí)別是public的修改為protected,原來(lái)是protected的繼續(xù)是protected,private不被繼承。
三、私有繼承,[ACCESS]是private
[ACCESS]為private時(shí),在派生類DerivedClass中,基類BaseClass的成員級(jí)別是public和protected的都修改為private,基類BaseClass的private成員不被繼承。
實(shí)例源碼
源碼中注釋內(nèi)容有錯(cuò)誤
兩字時(shí),表示此行會(huì)發(fā)生編譯錯(cuò)誤,將對(duì)應(yīng)行前的注釋刪除,再編譯即可重現(xiàn)錯(cuò)誤
。
D:\YcjWork\CppTour>vim c2006.cpp
#include <iostream>
using namespace std;/*** 類繼承的3種方式
*/// 基類
class Base {
public:int pub;
protected:int prot;
private:int priv;
};// 公有繼承
class PublicDerived : public Base {
public:void test() {pub = 1; // 正確,Base的public成員prot = 1; // 正確,Base的protected成員繼承為protected// priv = 1; // 錯(cuò)誤,Base的private成員不可訪問(wèn)}
};// 保護(hù)繼承
class ProtectedDerived : protected Base {
public:void test() {pub = 1; // 正確,Base的public成員變?yōu)閜rotectedprot = 1; // 正確,Base的protected成員保持為protected// priv = 1; // 錯(cuò)誤,Base的private成員不可訪問(wèn)}
};// 私有繼承
class PrivateDerived : private Base {
public:void test() {pub = 1; // 正確,Base的public成員變?yōu)閜rivateprot = 1; // 正確,Base的protected成員變?yōu)閜rivate// priv = 1; // 錯(cuò)誤,Base的private成員仍不可訪問(wèn)}
};int main() {PublicDerived pub_derived;PrivateDerived priv_derived;ProtectedDerived prot_derived;// 測(cè)試基類的訪問(wèn)權(quán)限pub_derived.pub = 2; // 正確,PublicDerived的public成員// prot_derived.pub = 1; // 錯(cuò)誤,ProtectedDerived的protected基類成員不可訪問(wèn)// priv_derived.pub = 1; // 錯(cuò)誤,PrivateDerived的private基類成員不可訪問(wèn)cout << "pub_derived.pub: " << pub_derived.pub << endl;//cout << "prot_derived.pub: " << prot_derived.pub << endl; // 錯(cuò)誤,ProtectedDerived的protected基類成員不可訪問(wèn)//cout << "priv_derived.pub: " << priv_derived.pub << endl; // 錯(cuò)誤,PrivateDerived的private基類成員不可訪問(wèn)return 0;
}
編譯運(yùn)行
D:\YcjWork\CppTour>gpp c2006D:\YcjWork\CppTour>g++ c2006.cpp -o c2006.exeD:\YcjWork\CppTour>c2006
pub_derived.pub: 2D:\YcjWork\CppTour>
運(yùn)行截屏
(全文完)