Vì vậy, dựa trên một tìm kiếm cursory, tôi đã biết rằng việc gọi một chức năng ảo (tinh khiết hoặc cách khác) từ một nhà xây dựng là một không đi. Tôi đã tái cơ cấu mã của mình để đảm bảo rằng tôi không làm điều đó. Trong khi điều này làm cho người dùng của các lớp học của tôi thêm một cuộc gọi chức năng bổ sung trong mã của họ, điều này thực sự không phải là lớn của một thỏa thuận. Cụ thể, thay vì gọi hàm tạo trong một vòng lặp, bây giờ chúng gọi hàm đó (trên thực tế!) Làm tăng hiệu suất của mã vì chúng ta không có việc xây dựng và phá hủy đối tượng được đề cập mỗi lần.Gọi chức năng ảo thuần túy từ chức năng thành viên lớp cơ sở trừu tượng?
Tuy nhiên, tôi đã tình cờ một cái gì đó thú vị ...
Trong lớp trừu tượng tôi có một cái gì đó như thế này:
// in AbstractClass.h:
class AbstractClass {
public:
AbstractClass() {}
virtual int Func(); //user can override
protected:
// Func broken up, derived class must define these
virtual int Step1() = 0;
virtual int Step2() = 0;
virtual int Step3() = 0;
// in AbstractClass.cpp:
int AbstractClass::Func() {
Step1();
// Error checking goes here
Step2();
// More error checking...
// etc...
}
Về cơ bản, có một cấu trúc phổ biến mà các chức năng ảo tinh khiết theo nhất của thời gian, nhưng nếu họ không Func() là ảo và cho phép các lớp dẫn xuất để xác định thứ tự. Tuy nhiên, mỗi bước phải được thực hiện trong các lớp dẫn xuất.
Tôi chỉ muốn chắc chắn rằng không có gì mà tôi nhất thiết phải làm sai ở đây vì hàm Func() gọi các hàm ảo thuần túy. Đó là, sử dụng lớp cơ sở, nếu bạn gọi StepX(), những điều xấu sẽ xảy ra. Tuy nhiên, lớp được sử dụng bằng cách tạo một đối tượng có nguồn gốc và sau đó gọi hàm Func() (ví dụ: MyDerivedObject.Func();) trên đối tượng dẫn xuất đó, nên có tất cả các hàm ảo thuần túy bị quá tải đúng cách.
Có bất kỳ điều gì tôi thiếu hoặc làm không chính xác bằng cách làm theo phương pháp này không? Cảm ơn đã giúp đỡ!
Đây là ví dụ về sách giáo khoa về sử dụng [Thành ngữ giao diện không phải ảo] (http://en.wikipedia.org/wiki/Non-virtual_interface_pattern) để triển khai [Mẫu phương thức mẫu] (http: // vi. wikipedia.org/wiki/Template_pattern). – Casey
Chỉ cần làm rõ, có sự khác biệt lớn giữa "gọi các hàm ảo trong một hàm tạo" và "gọi các hàm thuần ảo". Trước đây là khó khăn và nản chí (mặc dù hợp lệ), sau này là phẳng ra sai (và cũng không hoàn toàn tầm thường để làm). –
Gọi một hàm ảo trong một hàm tạo hoặc hàm hủy không phải là "không đi", trừ khi bạn không bận tâm để hiểu cách chúng hoạt động. –