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ệ?
Trả lời
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 foo
và ostream
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 { ... }
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.
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ệ. –
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?.
Đượ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 đó.
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ệ. –
- 1. Trường hợp trong công tắc bảo vệ
- 2. Khi nào chúng ta nên xem xét sử dụng riêng tư hoặc được bảo vệ?
- 3. Trong trường hợp nào có thể các trường gốc không được kế thừa?
- 4. chức năng ảo trong kế thừa riêng hoặc được bảo vệ
- 5. Hành vi thành viên được bảo vệ khi nó được kế thừa.
- 6. Làm thế nào để tạo một lớp được bảo vệ cho kế thừa?
- 7. này. so với base. cho các phương pháp không được bảo vệ được thừa kế?
- 8. Chúng ta có cần bản đồ Hibernate trong trường hợp này không?
- 9. khi nào chúng ta cần mẫu Adapter?
- 10. Rhino Mocks - Chúng ta có thực sự cần cuống?
- 11. Trường tĩnh có được kế thừa không?
- 12. Tại sao chúng ta cần giao diện trong Java?
- 13. Loại thừa kế nào thích hợp hơn?
- 14. Làm thế nào chúng ta có thể đọc tệp excel mật khẩu được bảo vệ (.xls) với POI API
- 15. Trong trường hợp nào chúng ta sử dụng Mẫu Nhà máy và trong đó Mẫu Singleton?
- 16. Lỗi * so * với trường hợp thừa kế lớp là gì?
- 17. ánh xạ doctrine2 ghi đè trường inversed đã thừa kế được thừa kế từ MappedSuperclass
- 18. phương pháp được bảo vệ bằng mocking
- 19. Tại sao bảo vệ có thể được truy cập trong cùng một gói mà không thừa kế trong java?
- 20. WCF trong môi trường thừa kế nhị phân
- 21. ghi đè nội bộ được bảo vệ bằng bảo vệ!
- 22. Chúng ta vẫn cần AsyncEnumerator của Richter?
- 23. Tại sao chúng ta cần ng-click?
- 24. Thừa kế bảng đơn (Tùy chọn thiết kế thừa kế cơ sở dữ liệu) ưu và nhược điểm và trong trường hợp nào nó được sử dụng?
- 25. Khởi tạo các trường trong các lớp kế thừa
- 26. Mã Silverlight có cần bảo vệ không?
- 27. PHP thừa kế và là thành viên tầm nhìn bảo vệ
- 28. Khi nào chúng ta cần mẫu trang trí?
- 29. Tại sao chúng ta cần strdup()?
- 30. Bảo vệ sao chép di sản thị trường Android
'giveы': Xin chào từ Nga :) – iehrlich
liên quan: [thừa kế protected] (http: // stackoverflow .com/questions/2090661/protected-inheritance) – ipc
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ệ. –