2012-03-31 28 views
6

Rõ ràng về thừa kế công và tư, nhưng những gì về bảo vệ? Bất kỳ ví dụ nào khi chúng ta thực sự cần sử dụng nó và nó mang lại lợi ích cho chúng ta?Trong trường hợp nào chúng ta cần sự thừa kế được bảo vệ?

+0

'giveы': Xin chào từ Nga :) – iehrlich

+2

liên quan: [thừa kế protected] (http: // stackoverflow .com/questions/2090661/protected-inheritance) – ipc

+2

Không phải mọi phần của C++ đều hữu ích. Nó là tự nhiên để * xác định * một tính năng như thừa kế bảo vệ, vì nó phù hợp gọn gàng vào lược đồ chung, nhưng điều đó không làm cho nó rộng rãi (hoặc ở tất cả) hữu ích. Ngay cả một số thứ mà * được * thiết kế rõ ràng hóa ra không hữu ích, như 'valarray',' export', 'vector ' hoặc các đặc tả ngoại lệ. –

Trả lời

3

Thành ngữ cơ sở từ thành viên cần được thừa kế được bảo vệ ở lần.

Vấn đề mà thành ngữ địa chỉ như sau: đôi khi bạn cần phải khởi tạo các lớp cơ sở với một thành viên của lớp có nguồn gốc, giống như trong

struct foo 
{ 
    virtual ~foo() {} 

protected: 
    foo(std::ostream& os) 
    { 
     os << "Hello !\n"; 
    } 
}; 

struct bar : foo 
{ 
    bar(const char* filename) 
     : foo(file), file(filename) // Bad, file is used uninitialized 
    {} 

private: 
    std::fstream file; 
}; 

Nhưng file được xây dựng saufoo, và do đó ostream được chuyển đến foo::foo không hợp lệ.

Bạn giải quyết việc này với một lớp phụ trợ và thừa kế riêng:

struct bar_base 
{ 
    std::fstream file; 

protected: 
    bar_base(const char* filename) 
     : file(filename) 
    {} 

    ~bar_base() {} 
}; 

struct bar : private bar_base, public foo 
{ 
    bar(const char* filename) 
     : bar_base(filename), foo(file) 
    {} 
}; 

Bây giờ bar_base được xây dựng trước khi fooostream truyền cho foo::foo là hợp lệ.

Nếu bạn muốn file để trở thành một thành viên bảo vệ của bar, bạn phải sử dụng thừa kế bảo vệ:

struct bar : protected bar_base, public foo { ... } 
2

protected có nghĩa là các biến thành viên sẽ có thể truy cập từ các lớp con chứ không phải từ bên ngoài.

Ví dụ rất đơn giản có thể là một lớp sử dụng biến số (giả sử x) để thực hiện một số tính toán nội bộ. Nếu một lớp con sẽ cần phải thực hiện cùng một tính toán, có thể sẽ cần truy cập x. Làm cho nó riêng tư sẽ tránh các phân lớp để truy cập nó, làm cho nó công khai sẽ làm cho nó có thể truy cập cho tất cả mọi người. Được bảo vệ giống như một sự cân bằng.

+2

Câu hỏi là về bảo vệ kế thừa, 'lớp a: bảo vệ b ', không phải về các thành viên được bảo vệ. –

4

Thừa kế được bảo vệ là điều có ý nghĩa giúp tôi vượt qua ngày này.

Đây là ý kiến ​​của Scott Meyers (Hiệu quả C++, Phiên bản thứ 3) về kế thừa được bảo vệ :).

Tuy nhiên, trang này thú vị: Effective C++: discouraging protected inheritance?.

0

Được bảo vệ đặc biệt hữu ích đối với các lớp siêu trừu tượng, được viết với kiến ​​thức về trẻ em. Các thành viên và phương thức được bảo vệ có sẵn cho trẻ em và có thể lưu lại bản sao mã mà không để chúng tiếp cận với thế giới bên ngoài lớp gia đình đang được triển khai vào thời điểm đó.

+2

Câu hỏi đặt ra là về sự thừa kế được bảo vệ, 'class a: protected b', không phải về các thành viên được bảo vệ. –

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