保護繼承表現出來的特徵在共有繼承、私有繼承dou'都能找到有交叉的地方。通常保護繼承的子類訪問父類成員的權限和公有繼承的子類訪問父類成員的quan權限相同,保護繼承的子類對象訪問父類成員的權限和私有繼承子類對象訪問父類成員的權限相同。具體來說,保護繼承的特點是父類的所有公有成員和保護成員都成爲子類的保護成員都成爲子類的保護成員,並且只能被他的子類成員函數或友元訪問,父類的私有成員仍然是私有的,子類的成員不可以直接訪問父類成員。
使用保護繼承方式的父類公有或保護成員可以傳遞給孫子類,在孫子中可以被正常訪問,這一點和私有繼承不同,在保護繼承中,父類的公有成員到子類中,其屬性將降級爲保護成員。
請看代碼5.cpp
#include <iostream>
using namespace std;
class A
{
private:
int a;
protected:
int b;
public:
int c;
void show()
{
cout << "a = " << a << "b = " << b << "c = " << c <<endl;
}
void set_a(int a)
{
this->a = a;
}
};
class B:protected A
{
public:
void set_a(int a)
{
A::set_a(a);
}
void set_b(int b)
{
this->b = b;
}
};
class C:protected B
{
};
int main()
{
C c;
c.set_a(10);
c.set_b(20);
c.c = 30;
c.show();
return 0;
}
編譯時會出現以下錯誤信息
:
由錯誤信息可以得知錯誤原因是保護繼承中的公有成員的屬性被降級成protected,比如類A中的公有成員c,到類B中成員c的屬性將變成protected,類B中的公有成員get_a(),get_b()在類C中的屬性也變成protected,所以類C的對象不能訪問這些protected成員,要使上面的chen程序輸出預料的結果可在類C中設計兩個公有成員,程序6.cpp如下:
#include <iostream>
using namespace std;
class A
{
private:
int a;
protected:
int b;
public:
int c;
void show()
{
cout << "a = " << a << "b = " << b << "c = " << c <<endl;
}
void set_a(int a)
{
this->a = a;
}
};
class B:protected A
{
public:
void set_a(int a)
{
A::set_a(a);
}
void set_b(int b)
{
this->b = b;
}
};
class C:protected B
{
public:
void set(int a,int b,int c)
{
set_a(a);
set_b(b);
this->c = c;
}
void show()
{
A::show();
}
};
int main()
{
C c;
c.set(10,20,30);
c.show();
return 0;
}
運行結果如下:
a=10 b=20 c=30