2013-07-05 30 views
2

我有以下類:從基類中調用一個沒有定義它的純虛函數?

class gkLogicBrick 
{ 
public: 
    gkLogicBrick(gkGameObject* object, gkLogicLink* link, const gkString& name); 
    virtual ~gkLogicBrick(); 

    virtual gkLogicBrick* clone(gkLogicLink* link, gkGameObject* dest) = 0; 

    //unimportant function/variables 
}; 

和它被子類,如:

class gkLogicController : public gkLogicBrick 
{ 
    gkLogicController(gkGameObject* object, gkLogicLink* link, const gkString& name); 
    virtual ~gkLogicController() {} 

    //unimportant function/variables 
}; 

命名爲clone()的方法不被一個gkLogicController對象上覆蓋了從另一個類但它被稱爲。我認爲調用純虛函數是不允許的? C++編譯器是否會爲所有繼承的純虛函數自動創建一個默認定義?

+0

是的,它編譯。它是大型圖書館的一小部分。我猜這是不允許的,所以也許我應該看得更遠,看看是否有其他事情正在發生,我錯過了... – mpellegr

回答

4

可以調用純虛函數(通過動態調度機制),這實際上是純虛函數的目的,當你想到它

我假設「從另一個類被調用的對象gkLogicController」實際上是指通過指針或引用ce到gkLogicController。這必須指向/引用從gkLogicController派生的類的實例,該類不會覆蓋clone。創建gkLogicController本身是不可能的,因爲它仍然是抽象的。

+0

這可能是它。 'gkLogicBrick'對象列表中的每個成員都調用'clone'函數,我進一步追蹤並看到'gkLogicController'對象被添加到這個列表中。現在我只需要看看那個函數是什麼,等等。 – mpellegr

+0

經過大量追蹤之後,我似乎找到了正在使用的實現克隆的對象類。謝謝! – mpellegr

2

我想你還沒有編譯你的代碼。由於

struct A 
{ 
    virtual void test()=0; 
}; 

struct B : A 
{ 

}; 

int main() 
{ 
    B b;  
} 

http://ideone.com/Dbx9iH

看到錯誤:

prog.cpp: In function ‘int main()’: prog.cpp:13:7: error: cannot declare variable ‘b’ to be of abstract type ‘B’ prog.cpp:6:8: note: because the following virtual functions are pure within ‘B’: prog.cpp:3:18: note: virtual void A::test()

1

如果你沒有在實際的類某處定義函數(如派生類),你會想,當得到一個錯誤(在編譯時)創建對象。

然而,如果基類從未直接實例化,那麼在基類中沒有一個是很好的 - 事實上,它經常以這種方式使用,只是爲了確保基類不應該被意外「使用」 。如果打算使用基類,那麼你需要實現該功能(即使= 0結束了,你仍然可以這樣做)。

而且虛擬函數的全部重點是允許基類(或一些其他只知道基類的組件)調用派生類中的實際函數

相關問題