在一個繼承圖裡,每個名字用virtual刻畫的基類,將總是用這個類的同一個對象表示。在另一方面,沒有用virtual描述的每個基類都有定義自己的子物件去表示它
class B
class XX : B {}; //B是私人基類
struct YY : B {}; //B是公有基類
第一:private, public, protected 訪問標號的存取範圍。
private:只能由1.該類中的函數、2.其友元訪問。
不能被任何其他訪問,該類的對象也不能訪問。
protected:可以被1.該類中的函數、友元 2.子類的函數、子類友元訪問。
但不能被該類的對象訪問。
public:可以被1.該類中的函數、友元 2.子類的函數、子類友元 3.該類的對象訪問。
註:友元函數包括3種:設為友元的普通的非成員函數;設為友元的其他類的成員函數;設為友元類中的所有成員函數。
第二:類的繼承後方法屬性變化。
private 屬性不能夠被繼承。
使用private繼承,父類的protected和public屬性在子類中變為private;
使用protected繼承,父類的protected和public屬性在子類中變為protected;
使用public繼承,父類中的protected和public屬性不發生改變;
如下所示:
public: protected: private:
public繼承 public protected 不可用
protected繼承 protected protected 不可用
private繼承 private private 不可用
protected繼承和private繼承能降低存取權限。
class A
{
public:
void fun(){cout <<"aa"<<endl;}
};
typedef void (A::* pf)(); //指向成員的指標
A aa;
pf pp = &A::fun;
(aa.*pp)();
靜態成員不予任何對象相關聯,因此指向靜態成員的指標也就是一個常規指標,例如:
class Task
{
static void schedule();
}
void (*p)() = &Task::schedule; //可以
void (Task::* pm)() = &Task::schedule; //錯誤
建構函式不能是虛函數