web-dev-qa-db-ja.com

関数から抽象クラスを返す

関数から抽象クラス(クラス自体または参照、問題ではない)を返すことは可能ですか?

29
cemregoksu

抽象クラスポインターを返すことができます-Bが抽象クラスAから派生した具象クラスであると仮定します:

A * f() {
    return new B;
}

または参照:

A & f() {
    static B b;
    return b;
}

またはスマートポインタ:

std::unique_ptr<A> f() {
    return std::make_unique<B>(...);
}
35
anon

いいえ、ただし関数は、抽象クラスへのポインター(または参照)の戻り型を持つことができます。次に、抽象クラスから派生したクラスのインスタンスを返します。

4
Justin Ethier

抽象クラスはインスタンス化できないため、返されません。

3
ThiefMaster

Factory設計パターンは、抽象クラスオブジェクトへのポインタを返す例です。

class Base
{ ; }

class One : public Base
{ ; }

class Two : public Base
{ ; }

Base * Factory(unsigned int number)
{
  Base * p_item(NULL);
  switch (number)
  {
    case 1:
      p_item = new One;
      break;
    case 2:
      p_item = new Two;
      break;
    default:
      p_item = NULL;
      break;
  }
  return p_item;
}

抽象基本クラスのinstanceは決して存在できないため、実際の抽象基本クラスオブジェクトを返すことはできません。上記の例のように、抽象基本型へのポインタと参照を返すことができます。

関数またはメソッドから返された抽象基本クラスへのポインターと参照は、実際には抽象基本型の子孫を参照します。

1
Thomas Matthews