有没有办法在基类的函数中获取派生类的类型?

Hub*_*cat 2 c++ abstract-class types function

我正在寻找一种方法来在基类的函数中使用派生类的类型,类似于模板化函数。

class Base
{
    T foo() const
    {
        return T(*this);
    }
}

class Derived : public Base
{
}
Run Code Online (Sandbox Code Playgroud)

这类似于我想用它来做什么,这样我就不必在每个派生类中将 foo 覆盖为纯虚函数。目标是找到一种方法让 foo 中的 T 成为派生类的类型。例如,在 Derived 类型的对象上调用 foo 应该调用如下所示的 foo 版本:

Derived foo() const
{
    return Derived(*this);
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能不是你能做的,但有人可以确认吗?

cig*_*ien 5

是的,你可以制作Base一个模板,并Derived在继承它时实例化它。这被称为 Curiously Recurring Template Pattern (CRTP):

template<typename T>
class Base
{
  public:
    T foo() const
    {
        return T(*this);
    }
};

class Derived : public Base<Derived>
{
};
Run Code Online (Sandbox Code Playgroud)

这是一个演示