2013-06-26 186 views
6

我想要做的是爲Execute()運行並完成它調用Base::Done()然後調用Derived::Done()。我這樣做是因爲BaseExecute會做些什麼,當它完成後,請致電Derived::Done()。我希望我能正確解釋它。有點像任務完成時調用的監聽器。我有點被困在Base班將如何稱爲Derived班。C++如何從基類中調用派生類中的方法

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

雖然可以做到這一點,你可能尋找模板方法模式(谷歌)。 –

回答

8

您可以使用模板方法:

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) { .... } 
}; 

這裏,Base控制自己的和衍生的方法是如何在Execute()使用,並且派生類型只需要執行該實施方案的一個組成部分通過一個私人的虛擬方法DoDone()

+0

感謝您的信息。我現在對它有了更好的理解 – adviner

3

基類方法可以調用派生方法很簡單:)在派生類中調用之前

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

已經完成了基類(,您可以把它作爲在派生類中的第一個語句方法,或者使用非虛擬成語。

下面是在派生類方法的頂部調用它的示例。這依賴於派生類來讓它正確。

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

下面是使用非虛成語的例子:

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

我試過這個例子,但是我一直得到一個錯誤 沒有匹配函數調用Base :: DoneImpl() – adviner

+0

上面的例子的哪部分是否會出錯? [這是第一個選項的工作源:http://ideone.com/8Iw6Hl。] –

相關問題