関数から抽象クラス(クラス自体または参照、問題ではない)を返すことは可能ですか?
抽象クラスポインターを返すことができます-B
が抽象クラスA
から派生した具象クラスであると仮定します:
A * f() {
return new B;
}
または参照:
A & f() {
static B b;
return b;
}
またはスマートポインタ:
std::unique_ptr<A> f() {
return std::make_unique<B>(...);
}
いいえ、ただし関数は、抽象クラスへのポインター(または参照)の戻り型を持つことができます。次に、抽象クラスから派生したクラスのインスタンスを返します。
抽象クラスはインスタンス化できないため、返されません。
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は決して存在できないため、実際の抽象基本クラスオブジェクトを返すことはできません。上記の例のように、抽象基本型へのポインタと参照を返すことができます。
関数またはメソッドから返された抽象基本クラスへのポインターと参照は、実際には抽象基本型の子孫を参照します。