簡體   English   中英

為什么不從線程調用重載成員?

[英]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 庫以創建線程調用entrythis作為pvArg ,而class Product在程序執行期間稍后創建它的線程。

現在事情是, class Item工作正常。 調用run function 並正確處理。 但是,當class Product稍后調用相同的 function 時,我得到:

pure virtual method called

兩個class的實現都是一樣的,都是重載了run方法,只是一個調用了一個沒有。

為什么我會突然得到一個pure virtual method called

謝謝。

更新: class Itemclass 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM