0

我有一个基类产品和一个子类 multiBuyProduct

class Product
{
public:
  Product(std::string name, Amount price);
}


class MultiBuyProduct :public Product
{
public:
MultiBuyProduct(std::string aName, Amount price, int minDiscountedQuantity, int  discountedPercent);

现在显然一些构造函数变量是相同的,但在我的主类中我假设如果我想要 multiBuyProduct 的功能我需要调用它?或者我可以调用产品并将 multiBuyProduct 构造函数的值传递给期望产品的参数吗?

下面显示了一种使用它的方法

void ShoppingCart::add(Product p, int quantity, bool end)
{
}  

以上是我想将参数发送到的方法,但我不知道是否需要更改此方法的代码以接受 MultiBuyProduct 或 ...??

编辑:抱歉忘了提到“金额”是一个需要两个整数的类

    Amount amount(0,1);
4

3 回答 3

1

您可能希望在 中添加一个virtual方法Product,例如,Amount Product::calculatePrice(int quantity)并在其中覆盖它,MultiBuyProduct以便它基于 执行正确的计算minDiscountedQuantity。然后,从add(). 此外,您需要传递引用 ( Product&) 或指针 ( Product*) 以add()使虚方法调用起作用。

于 2013-03-11T09:16:56.043 回答
1

您应该更改ShoppingCart::add如下内容,以实现多态行为:

void ShoppingCart::add(Product *p, int quantity, bool end)
{
  p->doSomething();
  // ...
  Product *product = p;
  product->doSomething();
  // ...
}

用法:

ShoppingCart shoppingCart;

MultiBuyProduct multiBuyProduct("Paper", Amount(0,1), 1, 1);

shoppingCart.add(&multiBuyProduct, 1, true);
于 2013-03-11T09:30:09.007 回答
0

你应该改变一些事情。

您需要一种类型的指针或引用来实现多态行为。

您需要调用基类构造函数。

您需要覆盖您的虚拟方法。

一旦依赖指针,就应该注意正确的内存管理。

你应该尽量保持const 正确

考虑下面这个例子:

#include <string>
#include <iostream>
#include <vector>
#include <memory>
#include <sstream>

class Product
{
private:
  double Price;
  std::string Name;

public:
  Product(const std::string& name, double price)
    : Price(price),
      Name(name)
  {
    std::cout << "Created " << name << " for $" << price << std::endl;
  }

  virtual std::string GetName() const
  {
    return Name;
  }

  virtual double GetPrice() const
  {
    return Price;
  }
};

class MultiProduct :public Product
{
private:
  int Quantity;

public:
  MultiProduct(const std::string& name, double price, int quantity)
    : Product(name, price),
      Quantity(quantity)
  {
    std::cout << "Created " << quantity << "x " << name << " for $" << price << " each." <<  std::endl;
  }

  virtual double GetPrice() const
  {
    return Product::GetPrice() * Quantity;
  }

  virtual std::string GetName() const
  {
    std::stringstream s;

    s << Product::GetName();
    s << " x";
    s << Quantity;

    return s.str();
  }
};

class ShoppingCart
{
private:
  std::vector< std::shared_ptr<Product> > Cart;

public:
  void Add( std::shared_ptr<Product> product )
  {
    Cart.push_back( product );
  }

  void PrintInvoice() const
  {
    std::cout << "Printing Invoice:" << std::endl;

    for( auto it = Cart.begin() ; it != Cart.end() ; ++it )
    {
      std::cout << (*it)->GetName() << ": " << (*it)->GetPrice()  << std::endl;;
    }
  }
};

int main()
{
  ShoppingCart cart;

  cart.Add( std::shared_ptr<Product>( new Product( "cheese", 1.23 ) ) );
  cart.Add( std::shared_ptr<Product>( new MultiProduct( "bread", 2.33, 3 ) ) );
  cart.Add( std::shared_ptr<Product>( new Product( "butter", 3.21 ) ) );
  cart.Add( std::shared_ptr<Product>( new MultiProduct( "milk", 0.55, 5 ) ) );
  cart.Add( std::shared_ptr<Product>( new Product( "honey", 5.55 ) ) );

  cart.PrintInvoice();

  std::cout << "Press any key to continue" << std::endl;
  std::cin.get();

  return 0;
}
于 2013-03-11T09:45:33.030 回答