从基类型的函数返回派生类对象

时间:2016-03-06 10:03:08

标签: c++ class return derived-class

假设我有三个类别,一个叫做角色,一个是ork,一个是人类。 人类和兽人都来自人格。 无论如何都要创建一个类型字符的函数,并且在函数内部能够返回从ork或human类创建的对象。或者也许还有另一种方法可以从同一个函数中返回ork或human对象。

编辑:没事的人当我在早些时候尝试这个时,我意外地从另一个班级派生了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; } }

2 个答案:

答案 0 :(得分: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表达式。

免责声明:编译器未触及任何代码。

答案 1 :(得分:0)

如果我的图像正确,你需要在基类Character中使用一个纯虚函数,整个函数将用于Human和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:

}