2017-07-21 7 views
6

Hier ist mein Code, und die IDE ist ++ DEV C 11Über Zeiger auf Elementfunktion der abgeleiteten Klasse

#include<iostream> 
using namespace std; 

class A{ 
    public: 
     int a=15; 
}; 
class B:public A 
{ 

}; 
int main(){ 

    int A::*ptr=&B::a; //OK 
    int B::*ptr1=&A::a; //why? 
    int B::A::*ptr2=&B::a;//why? 
    int B::A::*ptr3=&A::a; //why? 

} 

I Programmiersprachen gelesen haben - C++ und ich weiß, die Art der &B::aint A::* ist, aber ich verstehe nicht, warum die nächsten drei Zeilen die Compilation passieren werden. Und das seltsamste für mich ist die Syntax von int B::A::*, was bedeutet das? Ich bin nur ein Neuling von C/C++, also toleriere meine seltsame Frage.

+1

@Ron Ahem .. Es ** ist ** [MCVE]. 'ptr' ist vom Typ' int A :: * ',' ptr2' ist vom Typ 'int B :: A :: *', etc .. Wie Sie sehen können: der Code von OP [compiles just fine] (http://ideone.com/Cz2Bmg), sie sind nur verwirrt über ** warum ** es kompiliert. –

+0

@ AlgirdasPreidžius Wahr. Ich stehe korrigiert. – Ron

+1

Warum glaubst du, dass sie die Kompilation nicht bestehen sollten? –

Antwort

1

Diagrammdarstellung kann Ihnen helfen, zu verstehen, warum es in Ordnung ist und kompiliert int A::*ptr = &B::a;

int B::*ptr1 = &A::a;

int B::A::*ptr2 = &B::a;

int B::A::*ptr3 = &A::a

Interessant wird sein, wenn Sie die gleiche Variable in vererbten Klasse neu initialisieren

#include<iostream> 
using namespace std; 

class A { 
public: 
    int a = 15; 
}; 
class B :public A 
{ 
public: 
    int a = 10; 
}; 
int main() { 

    int A::*ptr = &B::a; //Waring class B a value of type int B::* cannot be 
         //used to initialize an entity of type 'int A::*' 
    int B::*ptr1 = &A::a; // why? 
    int B::A::*ptr2 = &B::a;//Waring class B a value of type int B::* cannot        
         // be used to initialize an entity of type 'int A::*' 
    int B::A::*ptr3 = &A::a; //why? 

} 
Verwandte Themen