C++ 类继承c++;

C++ 类继承c++;,c++,inheritance,C++,Inheritance,我有一个基本类产品和一个儿童类多重购买产品 class Product { public: Product(std::string name, Amount price); } class MultiBuyProduct :public Product { public: MultiBuyProduct(std::string aName, Amount price, int minDiscountedQuantity, int discountedPercent); 现在很明显,一

我有一个基本类产品和一个儿童类多重购买产品

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或

编辑:对不起,忘了提到“Amount”是一个接受两个整数的类

    Amount amount(0,1);

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

您应该更改
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);

你应该改变一些事情

对于多态行为,您需要一种类型的指针或引用

您需要调用基类构造函数

您需要重写虚拟方法

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

你应该试着去做

考虑以下示例:

#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;
}
#包括
#包括
#包括
#包括
#包括
类产品
{
私人:
双倍价格;
std::字符串名;
公众:
产品(常数标准::字符串和名称,双倍价格)
:价格,
姓名(姓名)
{

std::cout Thank,但我真的不太懂,我应该发布更多的代码吗?@AngryDuck:关于虚拟方法的解释对于这篇文章来说太长了,所以你需要仔细阅读。然而,核心思想是,当你在基类中有一个虚拟方法时,子类可能会用自己的代码替换该方法,以便在子类中,行为将有所不同。如果您有一个指向<代码>产品<代码>的指针,并调用一个虚拟方法,C++将计算指针真正指向的对象类型,并调用适当的方法。(因此,即使您不知道自己实际上拥有一个
多买产品
,您也会得到正确的价格计算)很好的一个感谢我现在得到的小解释,我对C++术语不清楚,它基本上是C++方法,只是用Java超标记来覆盖像java这样的方法:P@AngryDuck是的,C++中的虚拟方法就像java中的常规方法一样(或者说,java中的方法默认是虚拟的)在C++中,纯虚拟方法意味着与Java.thanks的抽象方法一样,对于信息@ AASMUD,它是与java有关的,与C++有关的,它在java中是很好的,但是在Java中有相当多的经验,当你能把它与你知道的东西联系起来时,总是让事情变得更为重要。hod add,我如何使用p?我把Product Product=p放进去,然后使用p.doSomething();例如,它只是说我不能使用Product=p;找不到二进制运算符??哦,好的,应该是Product Product=*p;现在没有错误,但是使用这个方法现在根本不返回任何内容。Product.getPrice();应该重新计算在main中传递的产品的价格,而不是什么都不做。应该这样使用
p
p->doSomething()
@AngryDuck:use
product
,就像我在回答中写的那样。谢谢这个例子,效果很好:)子类中的方法正在运行并给出预期的结果,我唯一的问题是,子类上的此方法将运行并返回一个带有折扣的价格,这取决于是否已向购物车添加足够的折扣,如果尚未添加足够的折扣,则我想调用正常的getPrice()来自父类product的函数我这样做对吗
returnproduct::getPrice(quantity)
谢谢,但这真的不是建设性的,我很欣赏你详细的回答,但我不打算拆下4个类,当人们给出的答案不太好时,完全重新制作它们。如果你以后在使用看似简单的解决方案时遇到问题,请随时回到这里,在开始之前看看这个答案We’我们问了一个新问题。其他答案似乎更简单,因为他们希望你已经知道他们的更改意味着你需要在你的程序中进行其他更改。如果你不这样做,它迟早会崩溃。如果你这样做,你最终会被你称为拆下4个类。谢谢你,但我的类结构很好我每个都有4个类为特定目的做功能我想做的就是扩展产品的功能,在购买一定数量的产品时增加折扣我不认为这需要重写4个类,我也不认为在一个侮辱性的庄园里说更简单/简单的方法是公平的这些答案更合适这只是一个例子示例。我无法仅在几个标题上编译某些内容,因此我必须组成一些类主体。您不需要逐字复制它们。这从来不是我的初衷。我的初衷是要有一个完整的、可编译的示例来显示您所需的所有功能。多态性、指针、虚拟方法、调用基类构造函数。