Tôi có một mẫu lớp trong đó một số phương thức được định nghĩa là ảo để cung cấp khả năng cho người dùng lớp của tôi cung cấp cho chúng trong lớp dẫn xuất của mình. Lưu ý rằng trong lớp mẫu của tôi có một số phương thức không ảo sử dụng ảo (một lớp ảo sẽ trả về một giá trị được gọi trong một lớp không ảo).ghi đè phương pháp ảo C++
Bạn có thể cho tôi một ví dụ đơn giản về mã đúng không, phương thức ảo của lớp cha sẽ trả về giá trị (nhưng thực thi được cung cấp trong lớp con) và giá trị được trả về bởi phương thức ảo trong lớp cha được sử dụng trong các phương pháp khác của lớp đó. Bởi vì tôi thấy một nơi nào đó (ví dụ ở đây: Safely override C++ virtual functions) rằng điều này có thể gây ra một số vấn đề và phương pháp do người dùng định nghĩa sẽ ghi đè lên phương thức ảo của lớp cha.
Lưu ý: Tôi lập trình bằng Code :: Blocks sử dụng trình biên dịch g ++.
EDIT: theo yêu cầu ở đây một ví dụ đơn giản về những gì tôi muốn:
template<typename T>
class parent {
public:
// Public methods that user can call
int getSomething(T t);
void putSomething(T t, int x);
// public method that user should implement in his code
virtual float compute(T t) { }
// protected or private methods and attributes used internally by putSomething ...
float doComplexeThings(...); // this can call
};
Phương pháp tính toán() nên được thực hiện bởi người dùng (lớp trẻ). Tuy nhiên, phương thức này() được gọi bởi putSomething() và doComplexeThings() chẳng hạn.
Đối với những gì bạn mô tả, một phương pháp ảo có thể không cần thiết (tính đa hình tĩnh có thể phù hợp với bạn) - khó có thể nói bằng mô tả của bạn. Vui lòng gửi mã mẫu mà bạn đã viết để chúng tôi hiểu rõ hơn về những gì bạn đang cố gắng làm. – kfmfe04
Ví dụ trong câu hỏi được liên kết là về những gì bạn nghĩ là ghi đè nhưng thực sự tuyên bố quá tải do lỗi, ví dụ: một const mất tích và không phải về giá trị trả lại. Bạn nghĩ điều gì là nguy hiểm, chính xác? – CashCow
Trong mã mẫu cổ điển, bạn thậm chí không cần phải khai báo một "tính toán nổi ảo" (T t) '. Bạn chỉ cần sử dụng nó (gọi nó) bên trong putSomething() và doComplexeThings() thông qua 't.compute()', nếu bạn có một xử lý đối với cá thể đó. Trình biên dịch sẽ báo lỗi nếu lớp T của bạn không thực hiện tính toán. Bằng cách này, cha mẹ và T thực sự thậm chí không phải sống trong cùng một hệ thống phân cấp thừa kế: tức là, T là con của mối quan hệ cha mẹ là không bắt buộc. Làm như vậy cũng có thể cung cấp cho bạn một cơ hội để cung cấp cho cha mẹ một tên có ý nghĩa hơn (vì mối quan hệ là không cần thiết). – kfmfe04