2012-10-14 46 views

Trả lời

5

Trong trường hợp này, không có sự khác biệt.

Ký hiệu này:

obj.Class::member

duy nhất là để giải quyết sự mơ hồ đến từ thừa kế:

class A { 
public: 
    int a; 
} 

class B { 
public: 
    int a; 
} 

class C : public A, B { 
    void func() { 
     // this objects holds 2 instance variables of name "a" inherited from A and B 
     this->A::a = 1; 
     this->B::a = 2; 
    } 

} 
6

Không có sự khác biệt. Mức độ không gian tên rõ ràng của ar là không cần thiết trong trường hợp này.

Nó có thể không thừa trong trường hợp thừa kế (nhiều, không phải ảo) xác định lại tên ar. Mẫu (giả tạo):

#include <string> 

class A 
{ 
    public: 
     int *ar; 
     A() { ar = new int[100]; } 
     // unrelated, but prevent leaks: (Rule Of Three) 
     ~A() { delete[] ar; } 
    private: 
     A(A const&); 
     A& operator=(A const&); 
}; 

class B : public A 
{ 
    public: 
     std::string ar[12]; 
}; 


int main() 
{ 
    B ob; 
    ob.A::ar[0] = 200; 
    ob.ar[0] = "hello world"; 
} 

Xem nó trên http://liveworkspace.org/code/d25889333ec378e1382cb5af5ad7c203

+0

bạn có thể giải thích những gì bạn đã viết dưới dạng mã riêng tư trong lớp A không? – Rushil

+1

@Rushil Vâng, đó là thực sự off-topic: đó là cách nhanh nhất để ngăn chặn 'A' từ được sao chép (mà sẽ dẫn đến việc xóa đôi' A :: ar'). Nó được gọi là [Quy Tắc Ba] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) hoặc, trong C++ 11 [Quy Tắc Không] (http: // rmartinho) .github.com/2012/08/15/rule-of-zero.html) thay vào đó :) – sehe

+0

OK. Tôi biết đó là chủ đề nhưng tôi muốn biết điều đó có nghĩa là gì. :-) – Rushil

1

Trong trường hợp này không có sự khác biệt. Tuy nhiên, hãy tưởng tượng rằng ob là của lớp C thừa hưởng cả hai từ lớp A và lớp B và cả A và B đều có một trường ar. Sau đó, sẽ không có cách nào khác để truy cập ar nhưng để xác định rõ ràng các thành viên dữ liệu được thừa kế mà bạn đang tham chiếu đến.

0

Bạn có nghĩa vụ phải đọc

ob.A::ar[0] = 200; 
ob.ar[0] = 200; 

như

này

A::ar[0] cũng giống như vậy đối với ar[0], do đó, 2 hàng về cơ bản giống nhau và toán tử :: được sử dụng để chỉ ra độ phân giải của không gian tên hoặc chỉ không gian tên.

kể từ ob là đối tượng thuộc loại A, độ phân giải không gian tên ẩn và bạn không cần A:: trước khi truy cập ar[0].

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