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の機能が必要な場合は、それを呼び出す必要があると思いますか?または、productを呼び出して、multiBuyProductコンストラクターの値を製品を期待しているパラメーターに渡すことはできますか?

以下にこれを使用する方法を示します

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

上記はパラメータを送信したいメソッドですが、MultiBuyProductを受け入れるためにこのメソッドのコードを変更する必要があるかどうかわかりません... ??

編集:申し訳ありませんが、「金額」は2つの整数を取るクラスです。

    Amount amount(0,1);
4

3 に答える 3

1

に基づいて正しい計算を実行するように、たとえば、にvirtualメソッドを追加し、それをオーバーライドすることをお勧めします。次に、からこのメソッドを呼び出します。さらに、仮想メソッドの呼び出しを機能させるには、参照( )またはポインター()を渡す必要があります。ProductAmount Product::calculatePrice(int quantity)MultiBuyProductminDiscountedQuantityadd()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 に答える