1,c++類的繼承分 public、protected、private三種:
基類的成員: public protected private
被public繼承後: public protected private
被protected繼承後: protected protected private
被private繼承後: private private private
注意,在子類定義中可以通過 using base::membernameorfuncname; 來重新定義許可權
2,對於友元類,不具有繼承性,例如:a是b的友元類,但a的基類及子類預設情況下不是b的友元類。
3,1) 基類的友元函式或友元類可以訪問基類的所有成員
2) 基類的友元函式或友元類可以訪問public繼承的子類中的父類所有成員
3) 基類的友元函式或友元類不可以訪問非public繼承的子類中的父類所有成員
4) 基類的友元函式或友元類不可以訪問子類中非父類的非public成員
5)子類的友元函式或友元類可以訪問子類的所有成員
6) 子類的友元函式或友元類可以訪問
任意繼承的子類中的父類所有成員
7) 子類的友元函式或友元類不可以直接訪問父類物件的非public成員
簡單記憶如下:
父親的朋友可以直接找父親,可以找公開住在兒子家中的父親,但不能找偷偷(protected/private)住在兒子家中的父親,更不能直接找兒子。
兒子的朋友可以直接找兒子,兒子的朋友可以找任何方式住在兒子家中的父親,
但不能直接去父親家找父親。
另外記住,成員函式的許可權與友元是完全一樣的,即上述內容同樣適用於成員函式,包括拷貝建構函式與賦值建構函式。
比如使用者**執行base = derive這種**,執行的是base的賦值建構函式,如果是非public繼承且base裡有非public成員變數,則編譯不通過(public繼承可以)。derive=base更是不允許的(這種編譯器不會預設定義賦值方式),只能是derive=derive這種。
但如果在子類的成員函式或友元內,因為處於子類作用域,不論何種繼承,base = derive是可以的。
#pragma once
class base;
class base;
class derive11;
class derive12;
int basefriend(derive11& derive1,base& base, derive12& devive2);
int derive11friend(derive11& derive1,base& base, derive12& devive2);
int derive12friend(derive11& derive1,base& base, derive12& derive2);
int derive13friend();
class base
virtual ~base(){}
friend int basefriend(derive11& derive1,base& base, derive12& devive2);
protected:
int m_nbasepro;
private:
int m_nbasepri;
};class derive11 :public base
protected:
void funcprotected();
int m_nprotected;
private:
void funcprivate();
int m_nprivate;
};class derive12 :protected base
; virtual ~derive12(void){};
friend int derive12friend(derive11& derive1,base& base, derive12& devive2);
protected:
void funcprotected(){};
int m_nprotected;
private:
void funcprivate(){};
int m_nprivate;
};class derive13 :private base
; virtual ~derive13(void){};
protected:
void funcprotected(){};
int m_nprotected;
private:
void funcprivate(){};
int m_nprivate;
};#include "classtest.h"
derive11::derive11(void)
derive11::~derive11(void)
void derive11::funcprotected()
void derive11::funcprivate()
void derive11::test()
int basefriend(derive11& derive1,base& base, derive12& derive2)
int derive11friend(derive11& derive1,base& base, derive12& derive2)
int derive12friend(derive11& derive1,base& base, derive12& derive2)
int derive13friend()
C 筆記 繼承,友元
一 友元關係 友元關係不可繼承,base是基類,derive是派生類,f是base的友元,這麼說來,f不能訪問derive的private成員 是無誤的 但是還是不夠準確,假設base有乙個privata的virtual函式func derive繼承並重寫了此函式,那麼在基類的友元f中有如下 看似f...
友元關係可以繼承 友元不能繼承
看這一段 struct顯然是編譯不過的,原因如題 友元關係不能繼承。但考慮這麼乙個情景 你想構建任意多的擴充套件去豐富b的功能,而這些擴充套件要用到b的一些非公開方法。既然是非公開,那就得友元了,但是擴充套件的類名你又不知道。最直觀的想法就是建立乙個擴充套件基類a,a是已知的,可以讓a成為b的友元。...
c 友元關係與繼承
友元關係不能繼承。基類的友元對派生類的成員沒有特殊訪問許可權。如果基類被授予友元關係,則只有基類具有特殊訪問許可權,該基類的派生類不能訪問授予友元關係的類。class base frnd has no access to members in d1 class d1 public base clas...