2012-09-03 72 views
3

我有一個關於傳值對象構造和虛方法的問題。將值傳遞給虛方法

我有這樣一個虛擬的方法:

typedef boost::function1<void, void*> Task 

class ITaskPool 
{ 
    //...... 

    virtual AddTask(Task task) = 0; 
}; 

然後像

class TaskPool : public ITaskPool 
{ 
    //...... 

    AddTask(Task task); 
}; 

如果我使用這樣的實施;

void MyFunc(void* arg) 
{ 

} 

int main() 
{ 
    TaskPool tp; 
    tp.AddTask(&MyFunc); 
} 

將任務對象被創建兩次,一次用於當它被傳遞給虛擬方法,並且當它被傳遞給派生類的方法的另一?

感謝

回答

3

只會創建一個副本。 當您聲明虛函數時,通過動態綁定調用該派生類的方法。它不是第一個方法A被調用,然後調用方法B的情況。 COmpiler在運行時決定調用哪種方法。

Polymorphism and Dynamic Binding

+0

聽起來合乎邏輯,感謝 – KaiserJohaan

2

你的代碼是錯誤的(缺少返回類型),但沒有,只有一個副本參與。我認爲你對多態性有錯誤的想法。它不像基類方法先被調用,然後被轉發到派生類。通過動態調度直接調用TaskPool::AddTask(如果它被稱爲多態)。

0

只有一種方法,在這裏:你聲明爲基類virtual之一。您在派生類中提供的是該方法的實現。因此,只會調用一個方法。作爲一種虛擬方法,通常會在運行時選擇它的實現,但只有一種方法會被調用。

0

只有一個副本將被創建...

+3

做解釋你的答案的理由也是如此。 –