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

问题描述

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

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

class Derived : public Base
{
}

这类似于我要使用它的目的,因此我不必在每个派生类中将foo作为纯虚函数重写。目的是为foo中的T找到派生类的类型提供一种方法。例如,在派生类型的对象上调用foo应该会调用看起来像这样的foo版本 这个:

Derived foo() const
{
    return Derived(*this);
}

我知道这可能不是您可以做的,但是任何人都可以确认吗?

解决方法

是的,您可以将Base用作模板,并在从其继承时使用Derived对其进行实例化。这称为好奇重复模板模式(CRTP):

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

class Derived : public Base<Derived>
{
};

这里是demo