2008-11-06 86 views
4
class AbstractQuery { 
    virtual bool isCanBeExecuted()=0; 
public: 
    AbstractQuery() {} 
    virtual bool Execute()=0; 
}; 

class DropTableQuery: public AbstractQuery { 
    vector< std::pair< string, string> > QueryContent; 
    QueryValidate qv; 
public: 
    explicit DropTableQuery(const string& qr): AbstractQuery(), qv(qr) {} 
    bool Execute(); 
}; 

是否有必要在派生類構造函數中調用基構造函數?如果抽象基類是一個接口,是否必須在派生類構造函數中調用基類構造函數?

+0

請使用正確的代碼格式,以便我們可以正確閱讀您的代碼段。 – 2008-11-06 22:33:27

回答

8

不,實際上基類沒有必要有明確定義的構造函數(儘管確保你有一個虛擬析構函數)。

因此,對於一個典型的接口,你可以有這樣的事情:

class MyInterface { 
public: 
    virtual ~MyInterface() {} 
    virtual void execute() = 0; 
}; 

編輯:這裏有一個原因,你應該有一個虛析構函數:

MyInterface* iface = GetMeSomeThingThatSupportsInterface(); 
delete iface; // this is undefined behaviour if MyInterface doesn't have a virtual destructor 
+0

這是一個更直接的問題來解釋你的原因http://stackoverflow.com/questions/270917/why-should-i-declare-a-virtual-destructor-for-an-abstract-class-in-c。 – Kevin 2008-11-07 00:56:51

2

不,不是在這個例子中你提供。在派生類的任何成員初始化之前,基類的默認構造函數將按照聲明基類的相同順序自動調用。

4

它是從來沒有必須顯式調用基類的構造函數,除非它有參數。編譯器會自動調用構造函數。理論上基類仍然有一個構造函數,但編譯器可能會將它優化爲不存在,如果它沒有做任何事情。

0

如果基類的構造函數不需要任何參數,則不需要在派生類中調用它,因爲它被稱爲默認構造函數。然而,即使它是空的,你也需要爲你的基類提供一個虛析構函數。否則,編譯器會默認生成一個非虛擬的默認析構函數。

相關問題