如何从c ++基类

时间:2017-10-29 21:52:05

标签: c++ inheritance

假设我想在所有派生类继承的基类中实现抽象行为。例如,克隆对象的函数对其应用一些修改并返回克隆和修改的对象(例如转置,复制等)。下面的代码使用一个更简单的函数,它只返回对象本身:

class Base
{
public:
    virtual Base* yourself ()
    {
        return this;
    }
};

class Derived : public Base
{
public:
    ...
};

void main()
{
    Derived d;
    auto result = d.yourself();
}

如果我没有遗漏某些内容,结果将是Base *类型,其中的目的显然是获取Derived *类型的对象。

有没有办法让自己()返回所有派生类的预期值而不在所有地方覆盖它(实际上,整个继承点只是实现每个行为一次)?

1 个答案:

答案 0 :(得分:3)

此问题相当常见,您可以使用模板解决此问题。像这样:

template <class T>
class Base
{
public:
    virtual T* yourself ()
    {
        return dynamic_cast<T*>(this);
    }
};

class Derived : public Base<Derived>
{
public:
    ...
};

它被称为Curiously recurring template pattern (CRTP)