是否有一种方法可以专门使用继承对象的一般方法
Is there a way to specialize a general method of an inherited object
我有两个专业对象:
class Food {};
class Fruit : public Food {};
class Vegetable : public Food {};
然后我有一个父母,该类将继承:
class Parent
{
virtual void say(Food* obj) { std::cout << "The object is food" << std::endl; }
};
和父母的继承类。
class Child : public Parent
{
virtual void say(Fruit* obj) { std::cout << "The object is a fruit" << std::endl; }
virtual void say(Vegetable* obj) { std::cout << "The object is a vegetable" << std::endl; }
};
我做:
std::vector<Food*> basket;
Fruit fruit = Fruit();
Vegetable vegetable = Vegetable();
basket.push_back(&fruit);
basket.push_back(&vegetable);
Child child = Child();
for (Food* food : basket)
{
child.say(food);
}
我希望它打印"物体是水果",然后"物体是蔬菜",但它不起作用:我收到错误消息:从"食物*"到"水果*"的参数1的转换尚无已知转换。
是否可以在不使用typeID的情况下做到这一点,因为我听说它会导致开销。这是在线编辑器中的代码:cpp.sh/27ekc
我认为适当的解决方案是以下内容:
class Food
{
public:
virtual ~Food() = default;
virtual void say() const;
};
class Fruit : public Food
{
public:
void say() const override { std::cout << "The object is a fruit" << std::endl; }
};
class Vegetable : public Food
{
public:
void say() const override { std::cout << "The object is a vegetable" << std::endl; }
};
class Parent
{
public:
virtual ~Parent() = default;
virtual void say(const Food& obj) const { obj.say(); }
};
class Child : public Parent {};
int main()
{
std::vector<Food*> basket;
Fruit fruit = Fruit();
Vegetable vegetable = Vegetable();
basket.push_back(&fruit);
basket.push_back(&vegetable);
Child child = Child();
for (const Food* food : basket)
{
child.say(*food);
}
}
编辑:根据您的评论,它基于您的健康意思。我将其解释为这些行:
class Food
{
public:
virtual ~Food() = default;
virtual void say() const;
virtual int health() const;
};
class Fruit : public Food
{
public:
void say() const override { std::cout << "The object is a fruit" << std::endl; }
int health() const override { return 5; }
};
class Vegetable : public Food
{
public:
void say() const override { std::cout << "The object is a vegetable" << std::endl; }
int health() const override { return 10; }
};
class Parent
{
public:
virtual ~Parent() = default;
virtual void say(const Food& obj) const { obj.say(); }
};
class Child : public Parent
{
int health;
public:
void eat(const Food& obj) { health += obj.health(); }
};
int main()
{
std::vector<Food*> basket;
Fruit fruit = Fruit();
Vegetable vegetable = Vegetable();
basket.push_back(&fruit);
basket.push_back(&vegetable);
Child child = Child();
for (const Food* food : basket)
{
child.say(*food);
child.eat(*food);
}
}
有很多不同的方法可以实现这一目标。
相关文章:
- 使用std::函数映射对象方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 从父类方法返回子类对象
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 为什么此派生对象无法访问基类的后递减方法?
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 正在调用shared_ptr对象方法
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 检查哪个对象调用了另一个对象的对象方法
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 没有取消引用/解包对象的标准方法?
- 使用 gmock c++ 在真实对象上调用方法
- 当我调用对象的方法时,对象的成员会发生变化
- 根据对象类调用不同的方法
- 如何在C++中循环访问未知对象方法?
- 使用动态实例化的对象填充矢量的快速方法
- 对类中的对象使用方法