Tôi cần khai báo phương thức hoàn thiện finalize()
cho tất cả hậu duệ của lớp cơ sở Base
, nên được gọi trong quá trình hủy và ý định của tôi là gọi số tinh khiết từ số ~Base()
, nhưng C++ cấm như vậy. Vì vậy, câu hỏi của tôi làGọi phương thức ảo từ trình phá hủy - giải pháp thay thế?
Làm thế nào chúng ta có thể bắt chước con cháu thực hiện một số công việc hoàn thiện đúng cách và được xác định sơ bộ?
Đó mã không thể được biên dịch:
#include <QDebug>
class Base {
public:
Base(){}
virtual ~Base(){
qDebug("deleting b");
finalize();
}
virtual void finalize() = 0;
};
class A : public Base
{
public:
A(){}
~A(){}
void finalize(){qDebug("called finalize in a");}
};
int main(int argc, char *argv[])
{
Base *b = new A;
delete b;
}
Nếu tôi làm Base::finalize()
không tinh khiết ảo, nó được gọi là từ ~Base()
mà không cử cho con vì nó đã được đã destructed.
Tôi có thể gọi finalize() từ destructor của trẻ nhưng câu hỏi là làm thế nào để buộc phải làm điều đó. Nói cách khác, câu hỏi của tôi là: có thể bắt buộc những người sẽ viết hậu duệ của lớp Base để sử dụng phương pháp hoàn thiện, theo cách khác hơn là bình luận nó trong một tài liệu? :)
Ok, tôi hiểu rồi, nhưng câu hỏi của tôi là: có thể bắt buộc những người sẽ viết hậu duệ của lớp Base để sử dụng phương thức hoàn thiện, hay không, theo cách khác hơn là bình luận nó trong tài liệu? :) –
Có thể xảy ra nhưng bạn có thể gặp lỗi trình biên dịch hoặc lỗi thời gian chạy, bởi vì vào thời điểm phá hủy 'Base' được gọi, hàm hủy' A' đã được gọi nên không có đối tượng 'A' trên đó gọi phương thức 'finalize()' của bạn. –
Tôi đã sử dụng mã mẫu của bạn và đã xác định 'finalize()' cho 'Base', do đó làm cho nó thuần ảo (không thuần túy). Nó biên dịch, nhưng xem những gì bạn nhận được từ việc thực hiện của nó http://ideone.com/opDXc –