2014-11-04 73 views
-3
#include<iostream> 

class base{ 
    public: 
    virtual void run()=0; 
    protected: 
    ~base(); 
}; 

class derived : public base { 
    public: 
    void run(){}; 
    ~derived(); 
}; 

int main(){ 
    std::shared_ptr<base> b; 
    b.reset(new derived); 
    b->run(); 
} 

我有一個抽象基類和它的派生類。主要的是,我定義了一個共享指針,並將其與派生類型分配。然後,我使用虛擬功能。如果我註釋掉b.reset(新派生),那麼它工作正常。錯誤信息是任何人都知道爲什麼這段代碼不能編譯?

Undefined symbols for architecture x86_64: "derived::~derived()", referenced from: std::__1::shared_ptr::shared_ptr(derived*) in test-274b97.o std::__1::__shared_ptr_pointer, std::__1::allocator >::__on_zero_shared() in test-274b97.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

任何答案將不勝感激!
謝謝。

+8

你沒有定義'derived ::〜derived()'。 – 0x499602D2 2014-11-04 17:26:55

+1

'base ::〜base()'也沒有定義。 – 2014-11-04 17:31:01

+1

從技術上講,它編譯但不鏈接。是的,這是因爲你聲明瞭,但沒有定義你的析構函數。 – 2014-11-04 17:31:52

回答

3

您沒有爲類base和派生類定義析構函數。你只是宣佈他們。還有析構函數必須是虛擬的

+0

在他的具體情況下,析構函數不一定是虛擬的,儘管它通常是個好主意。 – 2014-11-04 17:35:28

+0

@MooingDuck:不,在這種情況下,它必須在'base'虛擬,因爲存在多態刪除('shared_ptr ')。 – 2014-11-04 17:36:26

+2

@FredLarson:通過'reset'設置'shared_ptr'的值存儲給定的類型,在本例中爲'derived *'。這裏沒有多態刪除。如果它是'unique_ptr',那麼你會是對的,但'shared_ptr'是魔術。 http://en.cppreference.com/w/cpp/memory/shared_ptr/reset「總是選擇與提供的類型相對應的正確刪除表達式,這就是使用單獨參數Y將函數作爲模板實現的原因。」 – 2014-11-04 17:39:46

相關問題