繼承中的訪問控制

proteced例外

派生類通過派生類對象訪問受保護成員,不能通過基類對象訪問受保護成員。

三種繼承方式

public繼承維持基類關鍵字不變。

protected繼承把基類裏的pubulic設爲protected。降級

private繼承把基類裏的public和protected變爲private。降級。

派生類向基類轉換的可訪問性

class A{};
 
class B:public A{
public:
    void fun(B&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class C:protected A{
public:
    void fun(C&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class D:private A{
public:
    void fun(D&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class E:public B{
public:
    void fun(B&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class F:public C{
public:
    void fun(C&obj)
    {
        A obj1 = (A)obj;
    }
};
 
//從private繼承類派生的類不能轉換爲基類。
class H:public D{
public:
    void fun(D&obj)
    {
        A obj1 = (A)obj;  //error C2247: “A”不可訪問,因爲“D”使用“private”從“A”繼承
                          //error C2243: “類型轉換”: 從“D *”到“const A &”的轉換存在,但無法訪問
    }
};
 
void inherite_test()
{
    A *pb, *pc, *pe, *pd, *pf, *ph;
     
    pb = new B; //public 
    pc = new C; //protected           error C2243: “類型轉換”: 從“C *”到“A *”的轉換存在,但無法訪問    
    pd = new D; //private             error C2243: “類型轉換”: 從“D *”到“A *”的轉換存在,但無法訪問
    pe = new E; //public + public
    pf = new F; //protected + public  error C2243: “類型轉換”: 從“F *”到“A *”的轉換存在,但無法訪問    
    ph = new H; //private + public    error C2243: “類型轉換”: 從“H *”到“A *”的轉換存在,但無法訪問
}
--------------------- 
作者:liufei_learning 
來源:CSDN 
原文:https://blog.csdn.net/liufei_learning/article/details/21587085 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

1.測試函數說明只有一直公有繼承,才說明能在用戶代碼訪問類型轉換,印證了規則的第一條

2.B,C,D類都可以訪問類型轉換,印證了第二條規則

3.E,F,H類,印證了第三條

類的用戶

類的實現者:就是自己

普通用戶:就是外部調用者

派生類:就是類的孩子

看情況把成員分爲三種權限。

友元關係不能繼承

基類友元只能訪問基類和派生類的基類部分(權限基類控制),派生類友元不能通過基類對象訪問基類成員(權限派生類控制)

友元關係不能繼承,不能跨界

struct和class區別

1.默認類繼承級別

2.默認成員訪問說明符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章