2010-04-13 42 views
10

Trong C++ bạn có thể đặt một thành viên trong một lớp cơ sở và một thành viên có cùng tên trong lớp kế thừa.Lớp kế thừa C++ có thành viên cùng tên

Tôi làm cách nào để truy cập một trang cụ thể trong lớp được kế thừa?

+3

Câu hỏi bạn nên hỏi là tại sao bạn có các lớp học trong cùng một hệ thống phân cấp thừa kế có các thành viên được đặt tên trùng lặp khác biệt? Xem mục C++ hiệu quả 33. – TheJuice

+0

Nếu câu hỏi của bạn là cách truy cập phương thức dẫn xuất từ ​​tham chiếu cơ sở hoặc con trỏ, hãy thêm nhận xét. Vì nó được viết câu hỏi có thể được giải thích theo hai cách (và tất cả các câu trả lời chỉ đối phó với một trong số chúng) –

Trả lời

24

Trong trường hợp đó, bạn hoàn toàn đủ điều kiện cho tên thành viên.

class A 
{ 
public: 
    int x; 
}; 


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

Bằng cách đặt trước nó với classname::.

7

Nếu bạn chỉ định tên, bạn sẽ tự động truy cập tên đó trong lớp được kế thừa. Nếu bạn có nghĩa là làm thế nào để bạn truy cập vào một trong lớp cơ sở, sử dụng Base :: thành viên

3

Có.

Đủ điều kiện cuộc gọi của bạn, f(), với tên lớp: SpecificClass::f().

6

Để truy cập thành viên ẩn trong lớp cơ sở, bạn phải đặt trước tên thành viên bằng tên lớp cơ sở. Xem bên dưới:

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 [i wish] cho ví dụ. –

3

Một cách tiếp cận (đã đề cập trong tất cả các câu trả lời khác) là sử dụng tên thành viên đủ điều kiện, như Base::member. Nó có thể được sử dụng kết hợp với truy cập rõ ràng thông qua con trỏ this, nếu đó là kiểu của bạn: this->Base::member.

Cách tiếp cận khác là thực hiện truy cập thông qua this con trỏ được chuyển đổi rõ ràng thành loại lớp cơ sở: ((Base *) this)->member.

Tất nhiên, các tham chiếu ở trên là this con trỏ được tạo theo giả định rằng bạn đang cố truy cập thành viên từ bên trong một số hàm thành viên không tĩnh của lớp. Để truy cập nếu từ "bên ngoài", các thủ thuật tương tự có thể được áp dụng cho bất kỳ con trỏ nào khác (hoặc tham chiếu): some_pointer->Base::member hoặc ((Base *) some_pointer)->member.

Đối với các thành viên dữ liệu, hai phương pháp này tương đương nhau. Đối với các hàm thành viên, chúng có thể dẫn đến các kết quả khác nhau với các hàm ảo. Vì lý do này, nói chung, cách tiếp cận đầu tiên nên được ưa thích hơn.

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