2017-07-21 30 views
6

Dưới đây là mã của tôi, và IDE là DEV C++ Ngôn ngữ lập trình 11Về con trỏ tới hàm thành viên của lớp có nguồn gốc

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

} 

Tôi đã đọc - C++ và tôi biết loại &B::aint A::*, nhưng tôi không hiểu tại sao ba dòng tiếp theo sẽ vượt qua quá trình biên dịch. Và điều kỳ lạ nhất đối với tôi là cú pháp của int B::A::*, ý nghĩa của việc này là gì? Tôi chỉ là người mới của C/C++, vì vậy hãy tha thứ cho câu hỏi kỳ lạ của tôi.

+1

@Ron Ahem .. It ** is ** [mcve]. 'ptr' thuộc kiểu' int A :: * ',' ptr2' thuộc kiểu 'int B :: A :: *', v.v. Như bạn có thể thấy: mã được đăng bởi OP [biên dịch tốt] (http://ideone.com/Cz2Bmg), họ chỉ là nhầm lẫn về ** tại sao ** nó biên dịch. –

+0

@ AlgirdasPreidžius True. Tôi đứng sửa. – Ron

+1

Tại sao bạn nghĩ rằng họ không nên vượt qua biên soạn? –

Trả lời

1

Diagram đại diện có thể giúp bạn hiểu lý do tại sao nó là ok và biên dịch int A::*ptr = &B::a;

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

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

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

Thú vị sẽ được một khi bạn khởi tạo lại biến cùng trong kế thừa lớp

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

} 
Các vấn đề liên quan