V.C*_*tte 9 c++ inheritance constructor abstract-class c++14
我的代码中出现以下错误:
error: allocating an object of abstract class type 'Material'
我不知道如何处理这个案子.
我知道std::make_unique执行分配,所以它不能分配类型的对象Material,但我不知道如何纠正它.
#include <iostream>
#include <memory>
struct Material
{
Material() = default;
virtual int get_color() const = 0;
};
struct Basic : public Material
{
Basic() = default;
virtual int get_color() const override
{
return 1;
}
};
struct Mix : public Material
{
Mix(const Material& mat1, const Material& mat2)
: mat1_(std::make_unique<Material>(mat1))
, mat2_(std::make_unique<Material>(mat2))
{}
virtual int get_color() const override
{
return mat1_->get_color() + mat2_->get_color();
}
private:
std::unique_ptr<Material> mat1_;
std::unique_ptr<Material> mat2_;
};
int main()
{
auto mix = Mix(Basic(), Basic());
std::cout << mix.get_color() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
Sla*_*ica 13
这个电话:
std::make_unique<Material>(mat1)
Run Code Online (Sandbox Code Playgroud)
尝试创建一个类的实例Material,它与什么类型无关mat1.你似乎需要clone()班上的方法:
class Material {
...
virtual std::unique_ptr<Material> clone() const = 0;
};
Run Code Online (Sandbox Code Playgroud)
那么Mixctor将是:
Mix(const Material& mat1, const Material& mat2)
: mat1_(mat1.clone())
, mat2_(mat2.clone())
{}
Run Code Online (Sandbox Code Playgroud)
你需要clone()在每个派生类中实现:
struct Basic : public Material
{
Basic() = default;
virtual std::unique_ptr<Material> clone() const override
{
return std::make_unique<Basic>( *this );
}
virtual int get_color() const override
{
return 1;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4200 次 |
| 最近记录: |