Có vấn đề nào với việc ghi đè một phần các hàm ảo được xác định bởi một lớp cơ sở không?Các vấn đề với phần ghi đè chức năng một phần trong C++
trình biên dịch của tôi cung cấp các cảnh báo sau đây:
overloaded virtual function "MyBaseClass::setValue" is only partially overridden in class "MyDerivedClass".
Các lớp trông như thế này:
class MyBaseClass
{
public:
virtual void setValue(int);
virtual void setValue(SpecialType*);
}
class MyDerivedClass : public MyBaseClass
{
public:
virtual void setValue(int);
}
Cách đơn giản để thoát khỏi cảnh báo này là sử dụng tên gọi khác nhau cho các chức năng cơ bản, nhưng tôi muốn biết nếu có bất kỳ lý do thuyết phục nào để khắc phục cảnh báo cụ thể này. Tôi không tin điều này vi phạm tiêu chuẩn C++. Tôi đoán là để cảnh báo một lập trình viên rằng họ có thể đã quên thực hiện hành vi cho tất cả các kiểu đầu vào có thể. Trong trường hợp của chúng tôi, nó là cố ý loại trừ một số loại cụ thể.
Bạn có ngăn chặn hoàn toàn cảnh báo này không?
Nếu bạn đang cân nhắc sử dụng tên gọi khác nhau cho các chức năng cơ bản, bằng mọi cách làm như vậy. Điều đó gợi ý với tôi rằng MyBaseClass :: setValue (int) thực hiện một điều khái niệm khác với MyDerivedClass :: setValue (int), và điều đó không tốt. Các chức năng ảo phải làm điều tương tự trong cơ sở và có nguồn gốc, hoặc bạn có thể nhận được các lỗi khó tìm thấy từ những thay đổi nhỏ. –
Trong trường hợp cụ thể của tôi, họ đang làm khái niệm điều tương tự. Việc đổi tên có thể là một cái gì đó như setValueFromInt() setValueFromSpecialType() mà sẽ không trông sạch sẽ. Tôi muốn sử dụng các câu lệnh được mô tả trong một trong các câu trả lời. Hiện đang điều tra triển khai phương pháp tiếp cận đó. –