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

标签 c++ class return derived-class

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

编辑:别介意伙计们,事实证明,当我早些时候尝试这个时,我不小心从不同的类派生了 ork 和 human。实际上可以从基类型的函数返回派生类。 需要说明的是,这就是我所做的。

角色游戏::getPlayer(char symbol) { 开关(符号){ 案例“E”: 返回 Sprite 播放器; 休息; 案例'G': 返回 guardPlayer; 休息; 案例'K': 返回骑士玩家; 休息; 案例“R”: 返回 roguePlayer; 休息; 案例'W': 返回向导播放器; 休息; } }

最佳答案

首先假设你想返回一个派生类的,这很简单:

struct Derived;

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

struct Derived: Base {};

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

但是使用这种方法,如果 foo 要返回 Derived1Derived2,那么它的返回类型必须是公共(public)基类这两个(或更高)的类,然后结果将被切片到该基类。

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

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 表达式。

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

关于c++ - 从基类型的函数返回派生类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35825517/

相关文章:

c++ - 将成员函数指针作为模板类型传递

c++ - 从模板特化中获取对类成员的访问

return - 如何在 common lisp 中返回最后一个值

c++ - 我怎样才能让这个函数返回null?

c++ - 为什么这里的三元运算符与 if-else 不同?

php - 如何在 php 中访问私有(private)范围的命名空间数组数据?

excel - 如何加载 VBA 库引用并在同一过程中使用它?

java - 尝试使用 String 变量和 Class.forName 启动 Activity ,不断抛出 ClassNotFound 帮助

具有返回类型的 Java 方法在没有返回语句的情况下编译

java - 如何编写一个程序,可以不断地要求用户输入,直到输入满足运行代码的特定要求?