覆盖派生模板类的返回类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了覆盖派生模板类的返回类型相关的知识,希望对你有一定的参考价值。

如果我有一个带有虚函数Clone的抽象类A和一个继承A并重写Clone的模板类B,我想让这个函数返回类型B <T>而原来(在A中)返回类型A.

我试过这个,但编译器告诉我我不能返回一个抽象类:

class A
{
public:
    virtual A Clone() const = 0;
};

template <typename T>
class B : public A
{
private:
    T value;
public:
    B<T> Clone() const override
    {
        return B<T>(value);
    }
};

我相信这是不可能的,除非我从A的克隆和B的克隆返回A *和B <T> *,但我不想在堆上创建它。有没有办法做到这一点? (如果可能的话,我不想指向克隆的写入位置。)

注意:我遗漏了一些像构造函数那样的“噪音”。

答案

不,价值观不能做到这一点。值具有特定和固定的存储和类型。

您可以创建多态值类型,例如std::function,但它只使用继承作为实现细节(充其量)。

std::any是一个多态值类型,几乎没有接口;它根据内容大小使用SBO或堆。用附加接口扩充它并不是非常困难。

以上是关于覆盖派生模板类的返回类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能返回对使用模板创建的派生类的 unique_ptr 的引用?

C++重载隐藏和覆盖的区别

C++ 静态多态性 (CRTP) 和使用派生类的 typedef

具有派生类的模板化数据类型

C ++派生类覆盖返回类型

传递派生模板类的向量