2016-03-06 115 views
0

假設我有三個類,一個稱爲字符,一個ork和一個人類。 人類和ork都來自角色。 是否有創建一個字符類型的函數,並且該函數內部能夠返回從ork或人類創建的對象。或者,也許有另一種方式來返回來自同一功能的ork或人類對象。從基類型的函數返回派生類對象

編輯:沒想到人們,當我嘗試這個早期我意外派生ork和來自不同類別的人。實際上可以從基類型的函數中返回派生類。 只是要清楚這是我在做什麼。

character game::getPlayer(char symbol) { switch (symbol) { case 'E': return elfPlayer; break; case 'G': return guardPlayer; break; case 'K': return knightPlayer; break; case 'R': return roguePlayer; break; case 'W': return wizardPlayer; break; } }

+6

查找工廠模式。 –

+1

要使多態性和繼承真正起作用,您需要使用引用或指針。如果你有一個需要創建一個子類的函數,它應該返回一個指向基類的指針。 –

+0

@MikeMB:「你不能」是錯誤的。 –

回答

0

如果我正確描繪,u需要的基類字符與整函數內的一個純虛擬函數將在人類和ORC派生類可以使用。

class Character 
{ 
    public: 
     Character(); 
    virtual ~Character(); 

    virtual HRESULT Characterfunc() = 0; 

private: 

} 

,然後在派生類:

class Ork : public Character 
{ 
    public: 
     Ork(); 

    HRESULT Characterfunc();  

private: 

} 

,最後一個:

class Human : public Character 
{ 
    public: 
     Human(); 

    HRESULT Characterfunc();  

private: 

} 
1

讓我們先說要返回派生類的,這是簡單的:

struct Derived; 

struct Base { auto foo() -> Derived; }; 

struct Derived: Base {}; 

auto Base::foo() -> Derived { return {}; } 

但是使用這種方法,如果foo要返回Derived1Derived2,則其返回類型必須是這兩個(或更高)的公共基類,然後將結果切片到該基類。

所以你需要返回一個指針或引用,例如多個可能的動態的返回類型,

struct Base 
{ 
    auto foo() -> unique_ptr<Base>; 
    virtual ~Base() {} 
}; 

struct Derived1: Base {}; 
struct Derived2: Base {}; 

auto Base::foo() 
    -> unique_ptr<Base> 
{ return {garble_voff? new Derived1 : new Derived2}; } 

當直接使用簡單的unique_ptr你必須Base類虛析構函數,支持一個簡單的delete表達式。

免責聲明:編譯器不涉及任何代碼。