C++三種繼承方式--------私有繼承(private)

       私有繼承與公有繼承有什麼區別?如果將上一篇共有繼承中源代碼中類B繼承類A的方式改成私有繼承(private),其他部分代碼保持不變,編譯代碼,會出現一下錯誤信息:

    從編譯器指出的錯誤信息可以看出,父類A中的所有成員在子類對象B中都是不可見的。但是父類中的公有成員在私有繼承的子類B中是可見的,可以被訪問,但是其屬性在子類發生降級。父類A中的public和protected屬性的成員在子類中雖然能被訪問,但是其屬性在子類中被降級爲private,所有子類成員是無法訪問父類成員的,因爲對於子類對象來說,父類的成員全部都是private,都是不可見的。要想正確輸出,可用一下代碼實現:

#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 : private 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_a()
    { 
        return A::get_a();
    }
	
	int get_b()
    { 
        return b;
    }
	
	int get_c()
    { 
        return c;
    }
	
    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.get_c() <<endl;
    cout << "x = " << b.get_x() <<endl;
    cout << "y = " << b.get_y() <<endl;
    cout << "z = " << b.z <<endl;

    return 0;
}

運行結果如下:

       關於私有繼承的總結:父類公有成員和保護成員都作爲子類的私有成員,並且不能被這個子類的對象所訪問。如果子類再派生出一個孫子類的話,在孫子類是否能訪問父類的成員呢?因爲父類的成員在子類中只有公有成員和保護成員可以訪問,並且屬性降級爲private,所以孫子類即使是公有繼承子類的,也不能訪問private成員。所以在私有繼承時,父類的成員只能由直接派生子類訪問,而無法再往下繼承。

發佈了26 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章