#include <iostream>
template <class ParticularFruit>
struct FruitBase
{
FruitBase(int num) : m_inventory(num) {}
float netProfit() const
{
auto && particular_fruit = static_cast<const ParticularFruit &>(*this);
return particular_fruit.totalSellPrice() - particular_fruit.totalCostPrice();
}
protected:
int m_inventory;
};
struct Apple : FruitBase<Apple>
{
Apple(int num, float unitCostPrice, float unitSellPrice) :
FruitBase(num),
m_unitCostPrice(unitCostPrice),
m_unitSellPrice(unitSellPrice) {}
float totalCostPrice() const { return m_inventory * m_unitCostPrice; }
float totalSellPrice() const { return m_inventory * m_unitSellPrice; }
private:
float m_unitCostPrice;
float m_unitSellPrice;
};
struct Orange : FruitBase<Orange>
{
Orange(int num, float unitCostPrice, float unitSellPrice) :
FruitBase(num),
m_unitCostPrice(unitCostPrice),
m_unitSellPrice(unitSellPrice) {}
float totalCostPrice() const { return m_inventory * m_unitCostPrice; }
float totalSellPrice() const { return m_inventory * m_unitSellPrice; }
private:
float m_unitCostPrice;
float m_unitSellPrice;
};
template <typename Fruit>
void print_net_profit(const Fruit & fruit)
{
std::cout << "Net profit at current prices = $ " << fruit.netProfit() << std::endl;
}
int main()
{
Apple apple(100, 4.00, 4.25);
Orange orange(50, 7.00, 7.25);
print_net_profit(apple);
print_net_profit(orange);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFBhcnRpY3VsYXJGcnVpdD4Kc3RydWN0IEZydWl0QmFzZQp7CiAgICBGcnVpdEJhc2UoaW50IG51bSkgOiBtX2ludmVudG9yeShudW0pIHt9CgoJZmxvYXQgbmV0UHJvZml0KCkgY29uc3QKCXsKCQlhdXRvICYmIHBhcnRpY3VsYXJfZnJ1aXQgPSBzdGF0aWNfY2FzdDxjb25zdCBQYXJ0aWN1bGFyRnJ1aXQgJj4oKnRoaXMpOwoJCXJldHVybiBwYXJ0aWN1bGFyX2ZydWl0LnRvdGFsU2VsbFByaWNlKCkgLSBwYXJ0aWN1bGFyX2ZydWl0LnRvdGFsQ29zdFByaWNlKCk7Cgl9Cgpwcm90ZWN0ZWQ6CglpbnQgbV9pbnZlbnRvcnk7Cn07CgpzdHJ1Y3QgQXBwbGUgOiBGcnVpdEJhc2U8QXBwbGU+CnsKCUFwcGxlKGludCBudW0sIGZsb2F0IHVuaXRDb3N0UHJpY2UsIGZsb2F0IHVuaXRTZWxsUHJpY2UpIDogCgkJRnJ1aXRCYXNlKG51bSksCgkJbV91bml0Q29zdFByaWNlKHVuaXRDb3N0UHJpY2UpLAoJCW1fdW5pdFNlbGxQcmljZSh1bml0U2VsbFByaWNlKSB7fQoKCWZsb2F0IHRvdGFsQ29zdFByaWNlKCkgY29uc3QgeyByZXR1cm4gbV9pbnZlbnRvcnkgKiBtX3VuaXRDb3N0UHJpY2U7IH0KCWZsb2F0IHRvdGFsU2VsbFByaWNlKCkgY29uc3QgeyByZXR1cm4gbV9pbnZlbnRvcnkgKiBtX3VuaXRTZWxsUHJpY2U7IH0KCnByaXZhdGU6CglmbG9hdCBtX3VuaXRDb3N0UHJpY2U7CglmbG9hdCBtX3VuaXRTZWxsUHJpY2U7Cn07CgpzdHJ1Y3QgT3JhbmdlIDogRnJ1aXRCYXNlPE9yYW5nZT4KewoJT3JhbmdlKGludCBudW0sIGZsb2F0IHVuaXRDb3N0UHJpY2UsIGZsb2F0IHVuaXRTZWxsUHJpY2UpIDogCgkJRnJ1aXRCYXNlKG51bSksCgkJbV91bml0Q29zdFByaWNlKHVuaXRDb3N0UHJpY2UpLAoJCW1fdW5pdFNlbGxQcmljZSh1bml0U2VsbFByaWNlKSB7fQoKCWZsb2F0IHRvdGFsQ29zdFByaWNlKCkgY29uc3QgeyByZXR1cm4gbV9pbnZlbnRvcnkgKiBtX3VuaXRDb3N0UHJpY2U7IH0KCWZsb2F0IHRvdGFsU2VsbFByaWNlKCkgY29uc3QgeyByZXR1cm4gbV9pbnZlbnRvcnkgKiBtX3VuaXRTZWxsUHJpY2U7IH0KCnByaXZhdGU6CglmbG9hdCBtX3VuaXRDb3N0UHJpY2U7CglmbG9hdCBtX3VuaXRTZWxsUHJpY2U7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJ1aXQ+CnZvaWQgcHJpbnRfbmV0X3Byb2ZpdChjb25zdCBGcnVpdCAmIGZydWl0KQp7CglzdGQ6OmNvdXQgPDwgIk5ldCBwcm9maXQgYXQgY3VycmVudCBwcmljZXMgPSAkICIgPDwgZnJ1aXQubmV0UHJvZml0KCkgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKCUFwcGxlIGFwcGxlKDEwMCwgNC4wMCwgNC4yNSk7CglPcmFuZ2Ugb3JhbmdlKDUwLCA3LjAwLCA3LjI1KTsKIAoJcHJpbnRfbmV0X3Byb2ZpdChhcHBsZSk7CglwcmludF9uZXRfcHJvZml0KG9yYW5nZSk7Cn0K