创建指向纯虚拟类的新指针
Creating a new pointer to a pure virtual class
我有一个设计如下的类:
class Meal {
public:
virtual void cook() = 0; // pure virtual
}
class Omelette : Meal {
public:
void cook() {/*do something*/}; // non-virtual
}
class Waffle : Meal {
public:
void cook() {/*do something*/}; // non-virtual
}
std::vector< std::unique_ptr<Meal> > menu;
void addMeal(const Meal& meal) {
menu.emplace_back(new Meal(meal)); // cannot allocate an object of abstract type
}
我找不到将Meal
派生对象添加到menu
的方法,因为我无法创建抽象对象。有没有办法执行上面的代码?我希望Meal
保持抽象。我可以传入指向现有Meal
派生对象的指针,但是我的unique_ptr几乎不是唯一的。
这个问题的解决方案是虚拟复制构造函数;这在C++中是不允许的(这是不允许的,因为构造函数是与类本身相关的东西,它不能委托给类的子级)。这就是为什么clone
最适合这个问题。
这是一个类似的答案,使用最流行的语法。
所以,你的代码应该是
class Meal {
public:
virtual void cook() = 0; // pure virtual
virtual Meal* clone() const = 0; // pure virtual clone.
};
class Omelette : public Meal {
public:
void cook() {
/*do something*/
}; // non-virtual
virtual Omelette* clone() const
{
return new Omelette(*this);
}
};
class Waffle : public Meal {
public:
void cook() {
/*do something*/
}; // non-virtual
virtual Waffle* clone() const
{
return new Waffle(*this);
}
};
std::vector< std::unique_ptr<Meal> > menu;
void addMeal(const Meal& meal) {
menu.emplace_back( meal.clone() ); // cannot allocate an object of abstract type
}
您可以实现一个getNew
虚拟方法,该方法返回(派生的)对象的新副本并改用它。
相关文章:
- C++:将值 int(例如:0x00AAFAD8)转换为指针(指针本身也是 0x00AAFAD8 值)
- 未分配正在释放的指针 - 指针问题
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 我可以分配给新[]的指针
- 指针?指针功能
- 如何创建对象变量,以便每次分配新的指针
- 简单的功能大小;了解指针-指针差异
- 当我删除指针指针时会发生什么
- 关于将指针作为参数传递到函数:它实际上在函数中创建了新的指针
- 将向量向量转换为指针指针
- 理解c++中的指针指针以获得函数调用
- 在指针指针中更改价值
- 指针指针,动态内存分配
- 为什么我的新分配指针会自动在程序退出上删除
- 如何在不取消引用指针的情况下返回指针指针值?
- 使用新的指针
- C# 如何定义新的指针结构
- 提升指针PCL,用新的指针更新旧的指针并删除新的指针
- C++向列表添加新的指针对象
- 如何将字符指针数组拆分为两个带有分隔符的新字符指针数组