2011-03-01 197 views
9

我有一個簡單類,如下訪問基類成員中派生

class A { 
     protected: 
     int x; 
     }; 

class B:public A 
     { 
     public: 
     int y; 
     void sety(int d) 
     { 
     y=d; 
     } 
     int gety(){ return y;} 
     }; 

int main() 
{ 
B obj; 
obj.sety(10); 
cout<<obj.gety(); 
getch(); 
} 

如何從所導出的class B的實例設置的protected實例變量A::x的值,而無需創建的class A一個實例。

編輯:我們可以使用B的對象訪問A::x的值嗎?像obj.x

+0

只需訪問它。它在B的成員函數中可見。 – Erik 2011-03-01 11:14:32

回答

9

BA,所以創建的B實例被創建的A一個實例。話雖這麼說,我不知道您的實際問題是什麼,所以這裏的一些代碼,希望能澄清事情:

class A 
{ 
protected: 
    int x; 
}; 

class B : public A 
{ 
public: 
    int y; 

    int gety() const { return y; } 
    void sety(int d) { y = d; } 

    int getx() const { return x; } 
    void setx(int d) { x = d; } 
}; 

int main() 
{ 
    B obj; 

    // compiles cleanly because B::sety/gety are public 
    obj.sety(10); 
    std::cout << obj.gety() << '\n'; 

    // compiles cleanly because B::setx/getx are public, even though 
    // they touch A::x which is protected 
    obj.setx(42); 
    std::cout << obj.getx() << '\n'; 

    // compiles cleanly because B::y is public 
    obj.y = 20; 
    std::cout << obj.y << '\n'; 

    // compilation errors because A::x is protected 
    obj.x = 84; 
    std::cout << obj.x << '\n'; 
} 

obj可以訪問A::x一樣的A可能的情況下,因爲obj是隱式實例A

+0

可能想提及範圍以及如何影響訪問。 – reuscam 2011-03-01 11:29:34

+0

@reuscam,爲清晰起見編輯(希望) – ildjarn 2011-03-01 11:37:41

0

你只需將它簡稱爲x在B類

例如:

class B : public A 
{ 
public: 
    ... 

    void setx(int d) 
    { 
     x=d; 
    } 
}; 
1

A::x受到保護,因此無法從外部訪問,因此無法從A().xB().x訪問。然而,在A和那些直接繼承它的方法(因爲受保護而不是私有)的方法中可以訪問,例如, B。因此,不管語義如何,B::sety()都可以訪問它(如果是B::x的陰影或純粹冗長的情況,則爲xA::x)。

0

請注意,B不能完全訪問A :: x。它只能訪問成員通過B,不是A型的任何東西,或從A

派生的實例有一種變通方法,您可以把:

class A 
{ 
    protected: 
    int x; 
    static int& getX(A& a) 
    { 
     return a.x; 
    } 

    static int getX(A const& a) 
    { 
    return a.x; 
    } 
}; 

,現在使用的getX,一類派生自A(如B)可以獲得任何A類的x成員。

你也知道友誼不是傳遞或繼承。通過提供訪問功能,可以爲這些情況制定相同的「解決方法」。

在你的情況下,你可以通過使用公共函數來實際提供通過你的B的「公共」訪問。當然,在真正的編程中,它受到保護是有原因的,你不想讓所有的東西都能完全訪問,但是你可以。

+0

完全正確,但對於初學者,您應該將其與「private」的行爲進行對比: – MSalters 2011-03-01 14:46:36

相關問題