2015-08-03 171 views
2

函數返回指向抽象類的指針是否有意義?返回指向抽象類的指針的C++函數

+3

當然。例如,一個班級工廠通常會這樣做。 – rodrigo

+0

例如,如果你有一個std :: vector 成員,並且一個Get函數返回一個Base * ... Base可以是抽象的...所以基本上,當你使用多態或pimpl習語時它是有意義的 – Melkon

+0

@ Melkon:在這方面,pimpl如何相關? –

回答

12

當然,這就是多態性的要點:傳遞和使用指向抽象類的指針,而不管具體實現是什麼。

其中,Factory Pattern通常返回一個指向抽象類的指針。

1

是的它確實有道理。
這就像使用接口。

1

排序假設您有一個名爲AClass的抽象類,具體實現名爲CClass。您可以返回指向CClass的實例的指針,該實例的類型可以是AClass*CClass*。但是,由於無法實例化抽象類,因此無法返回指向抽象類的實例的指針。

但是,如果您返回AClass*,您的客戶端將只能訪問AClass的接口;如果他們想要訪問CClass功能沒有包含在AClass的界面中,他們需要將指針指向CClass*

3

是的,操作指向抽象類的指針(或引用)是有意義的,以便將接口從實際實現中分離出來並利用polymorphism的好處。

但要注意的是,如果該功能是負責分配返回的對象(某種factory)的,請務必使用一個虛擬的析構函數,以便能夠從抽象類的指針正確地刪除對象:

class Base { 
    public: 
    virtual ~Base() {} 
}; 

class Derived : public Base { 
    public: 
    ~Derived() override { 
     // Do some important cleanup 
    } 
}; 

Base* factory() { 
    return new Derived; 
} 

Base* base = factory(); 
base->~Base(); // calls Derived::~Derived 

如果沒有Base的虛擬析構函數,則不會調用Derived的析構函數。