是否可以在同一个类中创建一个类的实例?

Kai*_*zay 7 c++ c++11

说我有一节课:

class Foo{
public:

    Foo(){
    }

    //Is it possible to create a function like this:
    virtual Foo* createOb(){
       //Should create a new Foo,Bar or Fiz, depending on the actual object type.
    }
}

class Bar: public Foo{
public:

    Bar(){
    }
}

class Fiz: public Foo{
public:

    Fiz(){
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以createOb()在基类中使用方法,因此当在其中一个派生类的实例上调用createOb()时,是否会创建派生类的实例?

bol*_*lov 5

是的,可以使用CRTP完成.

首先,返回从中获取的原始指针new非常危险的.在c++原始指针中,只有当它们没有指向对象的所有权时才应该使用它们.所以我冒昧地使用unique_ptr:

struct Base {
  virtual auto create_obj() -> std::unique_ptr<Base>
  {
    return std::unique_ptr<Base>{};
  }
};

// abstract works too:
struct Base {
  virtual auto create_obj() -> std::unique_ptr<Base> = 0;
};

template <class Derived>
struct Base_crtp : Base {
  auto create_obj() -> std::unique_ptr<Base> override /* final */
  {
    return std::unique_ptr<Base>{new Derived{}};
  }
};

struct D1 : Base_crtp<D1>
{
};

struct D2 : Base_crtp<D2>
{
};
Run Code Online (Sandbox Code Playgroud)

然后:

auto b1 = std::unique_ptr<Base>{new D1{}};
auto b2 = std::unique_ptr<Base>{new D2{}};

auto new_d1 = b1->create_obj();
auto new_d2 = b2->create_obj();
Run Code Online (Sandbox Code Playgroud)