Điều bạn đang nói hơi mơ hồ và ví dụ sẽ hữu ích. Đặc biệt khi bạn sử dụng từ tĩnh, và không rõ ngữ cảnh của nó là gì.
Bạn không thể dừng một lớp dẫn xuất thừa kế tất cả các phương thức của một lớp cơ sở. Điều tốt nhất bạn có thể làm là làm cho nó trở thành một thành viên không yêu cầu tham số đối tượng cơ bản. Sau đó, bạn sẽ phải downcast đối tượng trước khi gọi nhưng bạn vẫn có thể gọi nó.
Điều bạn cho là dường như vi phạm nguyên tắc thay thế Liskov. Có nghĩa là bạn nên suy nghĩ lại về thiết kế của mình.
Cũng thay vì B kế thừa từ A. Bạn có thể muốn có một lớp cơ sở Q mà từ đó cả A và B lấy được. [1]
[1] Q là một trò đùa, một số học giả kinh thánh nghĩ rằng có một số cuốn sách không phổ biến mà họ gọi là Q mà mỗi phúc âm được sao chép từ đó.
Chỉnh sửa: Bổ sung.
Với ví dụ, một số điều rõ ràng hơn. Hãy để tôi thực hiện một số chỉnh sửa cơ bản cho sự hiểu biết của bạn về C++. Bạn nói, bạn có một số phương pháp tạo tĩnh vì xung đột đối số. Tôi nghĩ rằng tốt hơn để nói quá tải không thể giải quyết các phương pháp xây dựng khác nhau. Câu trả lời cho điều đó rất đơn giản: mở rộng quá tải theo một trong hai cách. Sử dụng enums hoặc sử dụng các lớp học. Đầu tiên bạn có thể thấy trong suối gọi đọc/thêm/read-write suối loại bằng cách thêm ios :: ăn, vv
Trong trường hợp của bạn:
enum BCT {halfLength,fullLength,quarterLength ...};
Sau đó làm Banana tĩnh Tạo (kích thước phao , BCT type = fullLength) { công tắc (loại) { trường hợp fullLength: return Banana (size); trường hợp halfLength: return Banana (size * 2); trường hợp quýLength: return Banana (size * 4); ... }}
phiên bản thay thế là sử dụng các lớp học để phân biệt các loại tham số (Tôi tin rằng James Coplien gọi là những hình mẫu)
class FullLength
class HalfLength
class QuarterLength
Sau đó:
static Banana Create(float length); // Full length
static Banana Create(float halfLength, HalfLength &dummy);
static Banana Create(float quarterlength, QuarterLength &dummy);
mới các lớp không thêm gì ở trên đầu, nhưng loại bỏ sự mơ hồ quá tải. Tôi tin rằng boost/std :: filesystem sử dụng cách này cho các trình vòng lặp directorty.
Có nói rằng, sau khi bạn quyết định cách tạo các phiên bản, các trường hợp này không phải là thành viên tĩnh. Họ có thể là các nhà thầu bình thường và điều đó sẽ giải quyết vấn đề của bạn. Hầu hết. Bạn vẫn sẽ không thể ngăn AdvancedBanana thực hiện phương thức tạo nửa chiều dài nhưng trình coder sẽ biết rằng anh ta đang thực hiện nó.
Một lưu ý ngắn gọn về tĩnh học, hàm thành viên tĩnh là những người mà không truy cập vào con trỏ này hoặc những gì một số ngôn ngữ gọi tự, tức là họ không truy cập vào các thành viên của một trường hợp cụ thể. Trong thực tế trong preC++ 98 ngày, trước khi họ có thống kê, những gì mọi người đã làm là để làm một cái gì đó như: ((Banana *)NULL)->static_function(arguments);
Trong ví dụ của bạn, tốt hơn là sử dụng các nhà thầu ở nơi đầu tiên. các nhà xây dựng tĩnh tốt hơn còn lại cho những thứ như các nhà máy nơi chúng thực sự cần thiết.
Ngoài ra, trong phản hồi của Mido dòng: a.CreateByHalfLength(1);
có thể hoặc không thể biên dịch, tôi sử dụng rất nhiều ngôn ngữ, đôi khi tôi bị lẫn lộn bởi những gì là bất hợp pháp: (nhưng là cho thấy suy nghĩ xấu. được Banana :: CreateByHalfLength (1); không phụ thuộc vào một thể hiện
Điều đó thực sự sẽ làm gì? Tôi đoán bạn muốn 'Derived :: constructBase (args, go, here)' không hoạt động? (nếu 'constructBase' là một phương thức tĩnh trên' Base', và 'Derived' mở rộng' Base') – immibis
Nếu tôi để nó như vậy, nó sẽ tạo ra một cá thể đối tượng cơ bản. Không có hại trong nó thực sự, chỉ gây nhầm lẫn. Ngoài ra các phương thức được gọi là "CreateByXYZWLH" hoặc "CreateByRxRy" vv cũng được áp dụng cho lớp dẫn xuất để tôi có thể muốn sử dụng lại tên. – user81993
@immibis Câu trả lời trông thẳng về phía tôi. Nếu tôi không sai, làm thế nào về việc sử dụng từ khóa riêng? – Nabin