/*
**test27.cpp : Defines the entry point for the console application.
**系統(tǒng)winXP SP3 32位.
**面向?qū)ο笾惖睦^承與派生、三種繼承方式的訪問權(quán)限
*/
#include "stdafx.h"
#include "iostream.h"
class A{
public:
void fA1(){
cout<<"fA1()"<<endl;
};
void fA2(){
cout<<"fA2()"<<endl;
};
int getInt(){
return iNum;
};
A(){
iNum = 0;
};
private:
int iNum;
};
class B:public A{
public:
void fB1(){
cout<<"fB1()"<<endl;
};
void fB2(){
cout<<"fB2()"<<endl;
};
};
class C:protected A{
public:
void fC1(){
cout<<"fC1()"<<endl;
};
void fC2(){
cout<<"fC2()"<<endl;
};
};
class D:private A{
public:
void fD1(){
cout<<"fD1()"<<endl;
};
void fD2(){
cout<<"fD2()"<<endl;
};
};
int main(int argc, char* argv[])
{
B b;
C c;
D d;
b.fA1(); //fA1(),public繼承,從A那里繼承而來的成員函數(shù),可以訪問到
b.fA2(); //fA2(),public繼承,從A那里繼承而來的成員函數(shù),可以訪問到
b.fB1(); //fB1(),類自身的成員,可以訪問到
b.fB2(); //fB2(),類自身的成員,可以訪問到
//cout<<b.iNum<<endl; //私有成員,訪問不到
cout<<b.getInt()<<endl; //私有成員,通過public的成員函數(shù)可以訪問到
//c.fA1(); //protected繼承,在子類中變?yōu)榱怂接谐蓡T,從A那里繼承而來的成員函數(shù),不可以訪問到
//c.fA2(); //protected繼承,在子類中變?yōu)榱怂接谐蓡T,從A那里繼承而來的成員函數(shù),不可以訪問到
c.fC1(); //fC1(),類自身的成員,可以訪問到
c.fC2(); //fC2(),類自身的成員,可以訪問到
//cout<<c.iNum<<endl; //私有成員,訪問不到
//cout<<c.getInt()<<endl; //protected繼承私有成員,getInt()在子類中變?yōu)榱怂接谐蓡T,訪問不到
//d.fA1(); //private繼承,從A那里繼承而來的成員函數(shù),不可以訪問到
//d.fA2(); //private繼承,從A那里繼承而來的成員函數(shù),不可以訪問到
d.fD1(); //fD1(),類自身的成員,可以訪問到
d.fD2(); //fD2(),類自身的成員,可以訪問到
//cout<<c.iNum<<endl; //私有成員,訪問不到
//cout<<c.getInt()<<endl; //private繼承私有成員,訪問不到
return 0;
}
Tips1:邏輯上類B繼承類A,則B是A的一種。類的繼承分為public公有繼承、protected保護(hù)繼承、private私有繼承。子類擁有父類除了父類構(gòu)造和析構(gòu)函數(shù),所有的成員函數(shù)和成員變量,子類就是一種特殊的父類,子類對(duì)象可以當(dāng)做父類的對(duì)象使用,子類可以擁有父類沒有的方法和屬性。
Tips2:具體的繼承方式與訪問控制權(quán)限如下:(注意這里的私有成員是被包含在繼承的類中的,但是不可訪問)

Tips3:總結(jié):只能在當(dāng)前類和子類中訪問的成員設(shè)置為protected;只能在當(dāng)前類被訪問的成員設(shè)置為private;?需要被外部訪問的成員直接設(shè)置為public。