如果我有一个带有虚函数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或堆。用附加接口扩充它并不是非常困难。