【问题标题】:Overriding return type of derived template class覆盖派生模板类的返回类型
【发布时间】:2018-06-06 00:46:45
【问题描述】:

如果我有一些抽象类 A 带有一个虚函数 Clone 和一个继承 A 的模板类 B > 并覆盖 Clone,我想让这个函数返回类型 B 而原来的(在 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*,但我不想创建这个在堆上。有没有办法做到这一点? (如果可能的话,我不想指向将克隆写入的位置。)

注意:我省略了一些“噪音”,例如构造函数等。

【问题讨论】:

  • 但我不想在堆上创建它 -- 指针不需要与堆有任何关系。
  • 我明白,但我想返回一个 B
  • 我可以从 A 的克隆返回 B 并覆盖 B 以使其没有字段吗?
  • 这似乎变成了XY problem。在高层次上,你想要完成什么?
  • 您是否考虑过使用std::vectorboost::anystd::any

标签: c++ templates inheritance polymorphism


【解决方案1】:

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

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

std::any 是一个几乎没有接口的多态值类型;它根据内容大小使用 SBO 或堆。用额外的接口来增强它并不是很困难。

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多