2011-09-10 35 views
27

Có phải lớp con kế thừa, các liên kết bạn bè của lớp chính (cả lớp chính và các lớp khác được kết bạn với lớp chính)?Thừa kế bạn bè trên C++?

Hoặc để đặt nó khác, cách thức kế thừa áp dụng cho từ khóa bạn bè?

Để mở rộng: Và nếu không, có cách nào để kế thừa tình bạn không?

Tôi đã theo gợi ý của Jon niêm yết vấn đề thiết kế:
C++ class design questions

+3

Nếu nhu cầu thiết kế của bạn Thừa kế Hữu nghị, đó là dấu hiệu tốt cho thấy thiết kế của bạn cần thay đổi. –

+0

Trường hợp sử dụng cho tính năng này là gì? Tùy thuộc vào những gì bạn thực sự muốn được thực hiện, có thể có lựa chọn thay thế khác hơn làm cho tất cả các lớp học của bạn rất thân thiện –

+0

@ David: Tôi sẽ bao gồm một liên kết đến một câu hỏi mô tả tình hình. – SSight3

Trả lời

35

Hữu không được thừa hưởng trong C++.

Tiêu chuẩn nói (ISO/IEC 14882: 2003, phần 11.4.8):

Hữu không phải là dự thừa hưởng cũng không bắc cầu.

+0

Có anyway để làm cho nó để nó kế thừa? – SSight3

+2

@ SSight3: Không, bạn sẽ cần phải làm cho tất cả các classies trong bạn bè phân cấp một cách rõ ràng (có thể với sự giúp đỡ của một preprocessor mã nguồn). Nếu bạn có một vấn đề cụ thể để giải quyết, hãy hỏi về nó một cách rõ ràng. – Jon

+0

Nghe như một gợi ý hay. – SSight3

2

Câu trả lời rất đơn giản: không có, lớp con không kế thừa các hiệp hội làm bạn. Một người bạn chỉ có thể truy cập các thành viên riêng của lớp mà hiệp hội được khai báo, chứ không phải của các phụ huynh và/hoặc con của lớp đó. Mặc dù bạn có thể truy cập thành viên được bảo vệ của một siêu lớp, nhưng tôi không chắc chắn về điều đó.

+2

Một lớp có nguồn gốc luôn có thể truy cập các thành viên được bảo vệ của lớp cơ sở, thông qua ** Người thừa kế ** chứ không phải ** Người bạn ** tàu. –

+0

@Als: 'Một lớp có nguồn gốc luôn có thể truy cập các thành viên được bảo vệ của lớp cơ sở'. Không, thực sự nó phụ thuộc. Phụ thuộc vào loại thừa kế! – Nawaz

+0

@Nawaz: Không thực sự! [Tôi nên kế thừa các bộ định danh truy cập nào với bảo vệ hoặc công khai riêng tư] (http://stackoverflow.com/questions/5447498/what-are-access-specifiers-should-i-inherit-with-private-protected-or-public /% 5d) nên đọc tốt cho bạn. –

6

Bạn có thể tạo các phương thức được bảo vệ (tĩnh) trong phụ huynh sẽ cho phép bạn làm những việc như vậy.

class MyFreind 
{ 
private: 
    int m_member; 
    friend class Father; 
}; 

class Father 
{ 
protected: 
    static int& getMyFreindMember(MyFreind& io_freind) { return io_freind.m_member; } 
}; 

class Son : public Father 
{ 
public: 
    void doSomething(MyFriend& io_freind) 
    { 
     int& friendMember = getMyFreindMember(io_freind); 
     // .... 
    } //() 
}; 

Tuy nhiên, bỏ qua đóng gói để bạn có thể nên xem xét lại thiết kế của mình.

+0

Điều này dường như cũng áp dụng cho câu hỏi được liên kết khác. Phản ứng tốt. Tôi đang nghĩ rằng một thiết kế lại là trong các công trình. – SSight3