从基本类型的函数返回派生 Class 对象
Returning a Derived Class Object from a function of the Base Type
假设我有三个 classes,一个叫 character,一个叫 ork,一个叫 human。
人类和兽人都源于性格。
无论如何创建一个字符类型的函数并且在该函数内部能够 return 从兽人或人类 classes 创建的对象。或者也许还有另一种方法 return 从同一个函数中获取 ork 或 human 对象。
编辑:别介意伙计们,事实证明,当我早些时候尝试这个时,我不小心从不同的 class 派生了 ork 和 human。实际上可以从基本类型的函数 return 派生 class。
只是为了清楚这就是我在做什么。
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;
}
}
如果我描述正确,你需要在基础 class 角色中使用一个纯虚函数,并且整个函数将用于派生的 class 人类和兽人中。
class Character
{
public:
Character();
virtual ~Character();
virtual HRESULT Characterfunc() = 0;
private:
}
然后在派生的 classes 中:
class Ork : public Character
{
public:
Ork();
HRESULT Characterfunc();
private:
}
最后一个:
class Human : public Character
{
public:
Human();
HRESULT Characterfunc();
private:
}
首先假设你想return派生class的值,这很简单:
struct Derived;
struct Base { auto foo() -> Derived; };
struct Derived: Base {};
auto Base::foo() -> Derived { return {}; }
但是使用这种方法,如果 foo
是 return Derived1
或 Derived2
,那么它的 return 类型必须是通用的这两个(或更高)的基数 class,然后结果将被切成基数 class.
因此,对于多个可能的动态 return 类型,您需要 return 指针或引用,例如,
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
时,您需要在 class Base
中有一个虚拟析构函数,以支持简单的 delete
表达式。
免责声明:none 编译器触及的代码。
假设我有三个 classes,一个叫 character,一个叫 ork,一个叫 human。 人类和兽人都源于性格。 无论如何创建一个字符类型的函数并且在该函数内部能够 return 从兽人或人类 classes 创建的对象。或者也许还有另一种方法 return 从同一个函数中获取 ork 或 human 对象。
编辑:别介意伙计们,事实证明,当我早些时候尝试这个时,我不小心从不同的 class 派生了 ork 和 human。实际上可以从基本类型的函数 return 派生 class。 只是为了清楚这就是我在做什么。
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;
}
}
如果我描述正确,你需要在基础 class 角色中使用一个纯虚函数,并且整个函数将用于派生的 class 人类和兽人中。
class Character
{
public:
Character();
virtual ~Character();
virtual HRESULT Characterfunc() = 0;
private:
}
然后在派生的 classes 中:
class Ork : public Character
{
public:
Ork();
HRESULT Characterfunc();
private:
}
最后一个:
class Human : public Character
{
public:
Human();
HRESULT Characterfunc();
private:
}
首先假设你想return派生class的值,这很简单:
struct Derived;
struct Base { auto foo() -> Derived; };
struct Derived: Base {};
auto Base::foo() -> Derived { return {}; }
但是使用这种方法,如果 foo
是 return Derived1
或 Derived2
,那么它的 return 类型必须是通用的这两个(或更高)的基数 class,然后结果将被切成基数 class.
因此,对于多个可能的动态 return 类型,您需要 return 指针或引用,例如,
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
时,您需要在 class Base
中有一个虚拟析构函数,以支持简单的 delete
表达式。
免责声明:none 编译器触及的代码。