2016-03-06 110 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表达式。

免责声明:编译器不涉及任何代码。