2012-08-04 65 views
1

我有一個抽象基類。關於聲明成員函數

我有一堆成員函數,它不是私有的,也不是靜態的,也不是模板,只是普通的公共成員函數。

而且我注意到,我定義任何*被稱爲在其他功能定義即使這些功能都沒有被主任何代碼運行這些市民的正常功能。

什麼叫我更關注的是,在任何情況下,如果是抽象類,所以實際上應該是如果類本身是不會被實例化任何方式強行定義的任何功能?

這是我在這裏發佈的第一個問題,很抱歉,如果我不是很好地解釋自己或做錯了什麼。

在此先感謝您的幫助!

下面是類的縮短版我說的:

#ifndef PROCESS_H_INCLUDED 
#define PROCESS_H_INCLUDED 

#include <iostream> 
#include <memory> 


using std::weak_ptr; 
using std::shared_ptr; 

class Process; 

typedef shared_ptr<Process> shProcess; 
typedef weak_ptr<Process> wProcess; 


class Process 
{ 
    friend class ProcessManager; 
public: 

    inline void AttachChild(shProcess shChild); 

    /* 
    FOR EXAMPLE I CAN LEFT THE FUNCTION ABOVE WITHOUT BEING DEFINE, BUT I HAVE 
    TO DEFINE THE FUNCTION BELOW OR I GET A COMPILER ERROR 
    COULD IT BE BECAUSE EVEN IF THIS CLASS IS ABSTRACT I AM USING IT AS A 
    PARAMETER OF OTHER FUNCTIONS FOR POLIMORPHIC PURPOSES? 
    */ 
    shProcess RemoveChild(void){return shProcess();}//reliases ownership of the child 

    shProcess PeekChild(void){return m_shChild;} //doesn´t release ownership of the child 

}; 

#endif //PROCESS_H_INCLUDED 
+1

恐怕你的問題是很難理解,尤其是部分「我定義任何所調用的其他函數的定義,這些市民的正常功能。」請重新說明這一點。 – SirDarius 2012-08-04 13:06:51

+1

你能展示一些代碼來展示你的意思嗎? – 2012-08-04 13:07:36

回答

0

你可以達到你要帶着好奇的效果,但儘管如此標準,使用語法= 0,如在

class T { 
    // ... 
    public: 
    virtual int foo() = 0; 
}; 
1

你可以逃脫只聲明函數(而不是提供主體)如果連接器能夠證明他們將永遠不會被調用。但是,由於編譯器必須構建一個vtable(某些其他編譯單元可能從類繼承並調用函數),然後鏈接器的任務要困難得多,虛擬函數可能會阻礙此操作。

+0

但在這種情況下,作爲類是抽象其功能將永遠不會被直接稱爲無論如何,所以爲什麼我還是要定義它們? – Azkron 2012-08-04 15:37:37

+0

這個地址是需要的,放在vtable中。你不能有一個沒有定義的函數的函數指針,它會導致鏈接錯誤。 – 2012-08-04 15:42:04