C++ 从重写的方法返回派生类,声明为返回基副本

C++ 从重写的方法返回派生类,声明为返回基副本,c++,C++,这又是一个反复出现的问题。有人知道一个简单的方法吗?假设我有以下几点: class Base { public: ... Base property(const std::string& name)=0; }; class Derived:public Base { public: Derived(); Derived(const Derived&& val); Base pr

这又是一个反复出现的问题。有人知道一个简单的方法吗?假设我有以下几点:

class Base
{
    public:
        ...
        Base property(const std::string& name)=0;
};
class Derived:public Base
{
    public:
        Derived();
        Derived(const Derived&& val);
        Base property(const std::string& name)
        {
            Derived z;
            return z;
        }
 }
有一种方法可以使派生::属性返回(在内部)成为派生副本,而不仅仅是基本部分副本,并且调用派生的move构造函数

也许这是个愚蠢的问题,但我真的找不到解决办法。为什么返回时复制构造函数不复制专用类

谢谢你

你不能这么做

从概念上讲,按值返回(忽略RVO和移动语义)意味着使用函数声明返回的类型的复制构造函数来复制您返回的任何内容。如果您返回一个
派生的
,将创建一个类型为
Base
的副本,并且您将丢失对象的
派生的
部分。这就是所谓的切片

如果要将
派生的
对象作为
返回,则需要使用指针。

不能这样做

从概念上讲,按值返回(忽略RVO和移动语义)意味着使用函数声明返回的类型的复制构造函数来复制您返回的任何内容。如果您返回一个
派生的
,将创建一个类型为
Base
的副本,并且您将丢失对象的
派生的
部分。这就是所谓的切片

如果要将
派生的
对象作为
返回,则需要使用指针。

不能这样做

从概念上讲,按值返回(忽略RVO和移动语义)意味着使用函数声明返回的类型的复制构造函数来复制您返回的任何内容。如果您返回一个
派生的
,将创建一个类型为
Base
的副本,并且您将丢失对象的
派生的
部分。这就是所谓的切片

如果要将
派生的
对象作为
返回,则需要使用指针。

不能这样做

从概念上讲,按值返回(忽略RVO和移动语义)意味着使用函数声明返回的类型的复制构造函数来复制您返回的任何内容。如果您返回一个
派生的
,将创建一个类型为
Base
的副本,并且您将丢失对象的
派生的
部分。这就是所谓的切片


如果要将
派生的
对象作为
返回,则需要使用指针。

对于搜索类似内容的用户,我能找到的唯一近似信息(与X3liF、TartanLlama和其他响应相关)

#定义可重写(T)ovr
#定义返回\u重载\u允许(类型)友元结构ovr;虚拟空*克隆()常量
#定义返回\重载\基本\允许(类型)友元结构ovr;虚拟void*clone()常量{返回新类型(*this);}
模板结构ovr
{
T*_obj;
ovr(常数T&T)
:_obj(重新解释_cast(t.clone()))
{;}
ovr(ovr&v)
:_obj(v._obj)
{
v、 _obj=nullptr;
}
算子T&()
{
返回*_obj;
}
虚拟~ovr()
{
删除_obj;
}
};
阶级基础
{
返回\u过载\u基本\u允许(基本);
公众:
虚拟可重写(基本)方法1();
虚拟~BASE();
};
派生类:公共基
{
返回\u重载\u基本\u允许(派生);
公众:
虚拟可重写(基本)方法1()
{
导出了一个;
返回a;
}
虚拟~派生();
};
导出了一个;
自动x=a.method1();

基本&实际导出=x我能找到的关于搜索类似内容的人的唯一信息(与X3liF、TartanLlama和其他回复相关)

#定义可重写(T)ovr
#定义返回\u重载\u允许(类型)友元结构ovr;虚拟空*克隆()常量
#定义返回\重载\基本\允许(类型)友元结构ovr;虚拟void*clone()常量{返回新类型(*this);}
模板结构ovr
{
T*_obj;
ovr(常数T&T)
:_obj(重新解释_cast(t.clone()))
{;}
ovr(ovr&v)
:_obj(v._obj)
{
v、 _obj=nullptr;
}
算子T&()
{
返回*_obj;
}
虚拟~ovr()
{
删除_obj;
}
};
阶级基础
{
返回\u过载\u基本\u允许(基本);
公众:
虚拟可重写(基本)方法1();
虚拟~BASE();
};
派生类:公共基
{
返回\u重载\u基本\u允许(派生);
公众:
虚拟可重写(基本)方法1()
{
导出了一个;
返回a;
}
虚拟~派生();
};
导出了一个;
自动x=a.method1();

基本&实际导出=x我能找到的关于搜索类似内容的人的唯一信息(与X3liF、TartanLlama和其他回复相关)

#定义可重写(T)ovr
#定义返回\u重载\u允许(类型)友元结构ovr;虚拟空*克隆()常量
#定义返回\重载\基本\允许(类型)友元结构ovr;虚拟void*clone()常量{返回新类型(*this);}
模板结构ovr
{
T*_obj;
ovr(常数T&T)
:_obj(重新解释_cast(t.clone()))
{;}
ovr(ovr&v)
:_obj(v._obj)
{
v、 _obj=nullptr;
}
算子T&()
{
返回*_obj;
}
虚拟~ovr()
{
删除_obj;
}
};
阶级基础
{
返回\u过载\u基本\u允许(基本);
公众:
虚拟可重写(基本)方法1();
虚拟~BASE();
};
派生类:公共基
{
返回\u重载\u基本\u允许(派生);
公众:
虚拟可重写(基本)方法1()
{
导出了一个;
返回a;
}
虚拟~派生();
};
导出了一个;
自动x=a.method1();

基本&实际导出=x我能找到的关于搜索类似内容的人的唯一信息(与X3liF、TartanLlama和其他回复相关)

#定义可重写(T)ovr
#定义返回\u重载\u允许(类型)友元结构ovr;虚拟空*克隆()常量
#定义返回\重载\基本\允许(类型)友元结构ovr;虚拟void*clone()常量{返回新类型(*this);}
模板结构ovr
{
T*_obj;
ovr(常数T&T)
:_obj(重新解释_cast(t.clone()))
{;}
ovr(ovr&v)
:_obj(v._obj)
{
v、 _obj=nullptr;
}
算子T&()
{
返回*_obj;
}
虚拟~ovr()
{
删除_obj;
}