[英]Why overloaded member not being called from thread?
我從Linux 自助網站復制了線程 class 的略微修改版本,我曾用它來創建線程基礎 class:
class Thread
{
public:
static void *entry (void *pvArg) { Thread *pobjThread = static_cast<Thread *> (pvArg); pobjThread->run (); }
virtual void run (void) = 0;
};
我有 2 個線程類:
class Item : public Thread
和
class Product : public Thread
class Item
從 function 的構造函數啟動線程,其中 class 進入 pthread 庫以創建線程調用entry
, this
作為pvArg
,而class Product
在程序執行期間稍后創建它的線程。
現在事情是, class Item
工作正常。 調用run
function 並正確處理。 但是,當class Product
稍后調用相同的 function 時,我得到:
pure virtual method called
兩個class的實現都是一樣的,都是重載了run
方法,只是一個調用了一個沒有。
為什么我會突然得到一個pure virtual method called
?
謝謝。
更新: class Item
與class Product
不同,因為Item
被聲明為static Item item;
在 cpp 文件中,只有一個。 class Product
像正常 object 一樣使用。如果我對class Product
做同樣的事情,它工作正常。
不要從構造函數或析構函數中調用虛函數 - 當代碼在其中運行時,inheritance 鏈是不完整的,因此,沒有有意義的方法來調用虛函數。 有關另一個答案,請參閱構造函數和析構函數的純虛擬調用。
Item 和 Product 是:public Thread 意味着您將在構造函數中調用一個虛擬的 function(本身)。 在構造函數內部,vtable 還沒有完全設置(因為它取決於每個被初始化的基類),所以你會得到未定義的行為。
最佳實踐:不要從構造函數/析構函數內部調用虛函數。 保持構造函數/析構函數非常簡單,在 init() function 或類似的內部執行 rest 的工作。
感謝 modelnine 指出的內容,我們發現有問題的代碼正在創建一個 object,啟動線程然后在線程有機會運行之前銷毀 object。 正如 modelnine 指出的那樣,刪除了 vtable,這導致了問題。
感謝 modelnine 在問題的評論中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.