2017-07-21 72 views
6

Oto mój kod, a IDE jest Dev C++ 11O wskaźnik do funkcji składowej klasy pochodnej

#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? 

} 

Przeczytałem Języki programowania - C++ i wiem, rodzaj &B::a jest int A::*, ale nie rozumiem, dlaczego kolejne trzy linie przejdą kompilację. A najdziwniejszą rzeczą dla mnie jest składnia int B::A::*, jakie jest tego znaczenie? Jestem tylko nowicjuszem C/C++, więc proszę znieść moje dziwne pytanie.

+1

@Ron Ahem .. It ** is ** [mcve]. 'ptr' jest typu' int A :: * ',' ptr2' jest typu 'int B :: A :: *', etc .. Jak widać: kod wysłany przez OP [kompiluje się dobrze] (http://ideone.com/Cz2Bmg), są po prostu zakłopotani tym, ** dlaczego ** to kompiluje. –

+0

@ AlgirdasPreidžius True. Poprawiono mnie. – Ron

+1

Dlaczego uważasz, że nie powinni przekazywać kompilacji? –

Odpowiedz

1

Diagram reprezentacja może pomóc zrozumieć, dlaczego to jest ok i kompiluje int A::*ptr = &B::a;

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

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

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

Ciekawe będzie po ponownej inicjalizacji tej samej zmiennej w dziedziczonej klasie

#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? 

}