2013-06-26 55 views
6

Điều tôi muốn làm là để Execute() chạy và hoàn thành nó gọi số Base::Done() rồi gọi số Derived::Done(). Tôi đang làm điều này bởi vì Base lớp Execute sẽ làm điều gì đó và khi được thực hiện, hãy gọi số Derived::Done(). Tôi hy vọng tôi sẽ giải thích nó một cách chính xác. Loại giống như một người nghe được gọi khi một công việc hoàn thành. Tôi bị mắc kẹt về cách lớp học Base sẽ gọi là lớp Derived.C++ cách gọi phương thức trong lớp dẫn xuất từ ​​lớp cơ sở

class Base 
{ 
    virtual void Done(int code){}; 
    void Execute(); 
} 

void Base::Execute() 
{ 
} 


class Derived : Base 
{ 
    void Done(int code); 
    void Run(); 
} 

Derived::Done(int code) 
{ 
} 

void Derived::Run() 
{ 
    Execute(); 
} 
+3

Mặc dù điều này có thể được thực hiện, có lẽ bạn đang tìm kiếm các mô hình phương pháp mẫu (google). –

Trả lời

8

Bạn có thể sử dụng một mẫu phương pháp:

class Base 
{ 
public: 
    void Execute() 
    { 
    BaseDone(42); 
    DoDone(42); 
    } 
private: 
    void BaseDone(int code){}; 
    virtual void DoDone(int) = 0; 
}; 

class Derived : Base 
{ 
public: 
    void Run() { Execute(); } 
private: 
    void DoDone(int code) { .... } 
}; 

Ở đây, Base điều khiển như thế nào phương pháp riêng và nguồn gốc của nó được sử dụng trong Execute(), và các loại có nguồn gốc chỉ phải thực hiện một thành phần của thực hiện điều đó thông qua phương pháp ảo riêng DoDone().

+0

Cảm ơn thông tin. Tôi đã hiểu rõ hơn về nó bây giờ – adviner

3

Các cơ sở phương pháp lớp có thể gọi phương thức có nguồn gốc khá đơn giản:

void Base::Execute() 
{ 
    Done(42); 
} 

Để có lớp cơ sở Done() gọi trước khi lớp được thừa kế, bạn có thể gọi nó như là tuyên bố đầu tiên trong lớp có nguồn gốc hoặc sử dụng thành ngữ không phải ảo.

Đây là ví dụ về cách gọi nó ở đầu phương thức lớp dẫn xuất. Điều này dựa vào lớp dẫn xuất để làm cho nó đúng.

void Derived::Done(int code) 
{ 
    Base::Done(code); 
} 

Dưới đây là một ví dụ về cách sử dụng thành ngữ phi ảo:

class Base 
{ 
    void Done(int code){ 
     // Do whatever 
     DoneImpl(); // Do derived work. 
    } 
    virtual void DoneImpl() { }; 
    ... 
}; 

class Derived { 
    virtual void DoneImpl() { 
     // Do derived class work. 
    }; 
    ... 
}; 
+0

Tôi đã thử ví dụ này nhưng tôi vẫn gặp lỗi không có chức năng phù hợp để gọi tới Base :: DoneImpl() – adviner

+0

Đối với phần nào của ví dụ trên, bạn có gặp lỗi không? [Đây là nguồn làm việc cho tùy chọn đầu tiên: http://ideone.com/8Iw6Hl.] –

Các vấn đề liên quan