2010-04-13 118 views
10

在C++中,您可以將成員放入基類中,並且可以在繼承類中使用同名成員。C++繼承類具有相同名稱的成員

如何訪問繼承類中的特定人員?

+3

你應該問的問題是爲什麼你有相同的繼承層次結構中具有不同名稱成員的類?請參閱有效的C++項目33. – TheJuice 2010-04-13 16:18:25

+0

如果您的問題是如何從基本引用或指針訪問派生方法,請添加註釋。正如它寫的那樣,這個問題可以用兩種方式來解釋(所有答案都只涉及其中的一個) – 2010-04-13 16:49:30

回答

24

在這種情況下,您應該完全限定成員名稱。

class A 
{ 
public: 
    int x; 
}; 


class B : public A 
{ 
public: 
    int x; 
    B() 
    { 
    x = 0; 
    A::x = 1; 
    } 
}; 
2

classname::爲前綴。

7

如果指定名稱,將自動訪問繼承類中的名稱。如果你的意思是你如何訪問基類中的一個,請使用Base :: member

3

是的。

確認您的通話,f(),類名爲:SpecificClass::f()

6

要訪問基類中隱藏的成員,必須在成員名稱前加上基類名稱。請看下圖:

class A 
{ 
protected: 
    int i; 
}; 

class B : public A 
{ 
public: 
    void foo(void) 
    { 
     int a_i = A::i; 
     int b_i = i; 
     int b_i_as_well = B::i; 
    } 
private: 
    int i; 
}; 
+0

+2 [我希望]爲例。 – 2010-04-13 16:26:31

3

一種方法(在所有其他答案已經提到)是使用合格的成員名稱,如Base::member。如果這是你的風格,可以通過this指針直接訪問它,如果這是你的風格:this->Base::member

另一種方法是通過this指針執行訪問,該指針明確轉換爲基類類型:((Base *) this)->member

當然,上述對this指針的引用是在假設您試圖從類的某個非靜態成員函數內訪問成員的情況下作出的。要從「外部」訪問,可以將相同的技巧應用於任何其他指針(或參考):some_pointer->Base::member((Base *) some_pointer)->member

對於數據成員來說,這兩種方法是等價的。對於成員函數,它們可以通過虛函數導致不同的結果。出於這個原因,一般來說,第一種方法應該是優選的。

相關問題