C++三種繼承方式--------共有繼承(public)

首先看一段代碼(0621_3.cpp):

#include <iostream>
using namespace std;

class A
{
private:
    int a;
protect:
    int b;
public:
    int c;
    void show()
    {
		cout << "a = " << a << "b = " << b << "c = " << c <<endl;
    }
	
    int set(int a,int b,int c)
    {
	this->a = a;
	this->b = b;
	this->c = c;
    }
};

class B : public A
{
private:
    int x;
protected:
    int y;
public:
    int z;
	
    void show()
    {
	cout << "a = " << a << "b = " << b << "c = " << c << "x = " << x << "y = " << y << "z = " << z <<endl;
    }
	
    int set(int a,int b,int c,int x,int y,int z)
    {
	this->a = a;
	this->b = b;
	this->c = c;
	this->x = x;
	this->y = y;
	this->z = z;
    }
};

int main()
{
    B b;
    b.set(10,20,30,40,50,60);
    b.show();
	
    cout << "a = " << b.a <<endl;
    cout << "b = " << b.b <<endl;
    cout << "c = " << b.c <<endl;
    cout << "x = " << b.x <<endl;
    cout << "y = " << b.y <<endl;
    cout << "z = " << b.z <<endl;

    return 0;
}

其實這段代碼是編譯不能通過的,編譯信息如下:

該程序的錯誤原因在上面的錯誤信息中。描述的非常清楚,這主要是因爲私有成員和保護成員非法訪問錯誤,類的私有成員在對象中不可以被訪問,同樣在公有繼承的子類中也不可以被訪問父類私有成員。在子類中,如果想訪問父類的私有成員,可以將父類的私有成員隱藏起來,對外公開一個共有訪問該數據成員的接口函數。比如要在子類B中獲取父類A的私有成員a的值,可以在父類A中增加一個共有接口函數,代碼如下:

int get_a()
{
    return a;
}

     保護成員(protected修飾的成員)具備private和public部分屬性。具體地說,protected修飾的類成員,在實例的對象中不可以被訪問,這個特性和private相同。但是protected修飾的類成員在其派生的子類中是可以被訪問的,這一點和public修飾成員相同。所以在類A中的protected屬性的數據成員b,在其子類B中可以直接訪問,但是在B的對象中不可以被訪問,要想訪問,可以像上面一樣構造一個公共的接口。完整代碼如下:


 

 
#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;
    }
	
    int set(int a,int b,int c)
    {
	this->a = a;
	this->b = b;
	this->c = c;
    }
    
    int get_a()
    {
        return a;
    }

    int get_b()
    { 
        return b; 
    }
};

class B : public A
{
private:
    int x;
protected:
    int y;
public:
    int z;
	
    void show()
    {
	cout << "a = " << get_a() << "b = " << b << "c = " << c << "x = " << x << "y = " << y << "z = " << z <<endl;
    }
	
    int set(int a,int b,int c,int x,int y,int z)
    {
	A::set(a,b,c);
	this->x = x;
	this->y = y;
	this->z = z;
    }

    int get_x()
    { 
        return x;
    }

    int get_y()
    {
        return y;
    } 
};

int main()
{
    B b;
    b.set(10,20,30,40,50,60);
    b.show();
	
    cout << "a = " << b.get_a() <<endl;
    cout << "b = " << b.get_b() <<endl;
    cout << "c = " << b.c <<endl;
    cout << "x = " << b.get_x() <<endl;
    cout << "y = " << b.get_y() <<endl;
    cout << "z = " << b.z <<endl;

    return 0;
  }

關於共有繼承總結:

      共有繼承的特點是父類的公有成員(public)和保護成員(protected)都被子類繼承,並且這些子類的屬性保持不變,在子類中也可以訪問父類的公有(public)或保護(protected)成員。父類的私有成員沒被子類繼承,並且不能在子類中訪問父類私有成員。

      對於公有繼承方式,必須搞清楚父類成員對於子類和子類對象的訪問權限,或者說是可見的還是隱藏的。下面分兩種情況總結。

      父類成員對於子類對象的可見性:父類的公有成員對於子類的對象來說是可見的,其他成員隱藏,不可以直接訪問。這裏父類的保護成員被訪問的權限等同於私有成員。

      父類成員對子類的可見性:父類的公有成員和保護成員可見,而私有成員被隱藏,不可以直接訪問。這裏父類的保護成員被訪問的權限等同於共有成員。


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