代码之家  ›  专栏  ›  技术社区  ›  A.Saeed

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

  •  0
  • A.Saeed  · 技术社区  · 8 年前

    假设我有三类,一类叫性格,一类是工作,一类人。 人和工作都源于性格。 无论如何,是否可以创建一个字符类型的函数,并在该函数中返回从工作类或人类类创建的对象。或者,也许还有另一种方法可以从同一个函数返回工作或人类对象。

    编辑:不要紧,伙计们,当我早些时候尝试这个时,我意外地从一个不同的类派生出了work和human。实际上,可以从基类型的函数返回派生类。 我只是想说清楚,这就是我在做的。

    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 回复  |  直到 8 年前
        1
  •  1
  •   Cheers and hth. - Alf    8 年前

    首先假设您想返回 价值 派生类,这很简单:

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

    但采用这种方法,如果 foo 是返回 Derived1 Derived2 ,则其返回类型必须是这两个(或更高)中的公共基类,然后结果将被切成该基类。

    因此,对于多种可能的动态返回类型,您需要返回指针或引用,例如。,

    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 表示

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

        2
  •  0
  •   Achiko Mezvrishvili    8 年前

    如果我画得正确,你需要一个基类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:
    
    }