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.默認成員訪問說明符