C 繼承 友元 許可權

2021-07-10 04:37:29 字數 2982 閱讀 5079

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...