我的项目中有以下课程:
Product
(这是基类)
FarmProduct
(源自产品)
FruitProduct
(源自FarmProduct)
(这3个课程是演示,我还有更多)。
我还有以下两个功能:
CalcPrice
- 在Productd中什么都不做,但在Farm和Fruit中做了什么。
Print
- 每个班级的工作,注意 - 水果印刷品必须包含产品和农场印刷品。
主要是这段代码:
int main() {
Product pro(123, 'A', 1, 22, 1, 1);
FarmProduct farm(1, 2, 3, "Kiwi", pro);
Product *products = new Fruit(1, farm);
products->Print();
products->Calc();
}
我的问题是: 我是否需要做"产品"抽象类,只使用指针? 要么 我应该制作一个新的抽象类并将其放入函数" Print()"和" Calc()"和产品类将来自她? (因此农场和水果也将固有)。
非常感谢! p.s - 可能是语法错误很少,我的母语不是英语:)
答案 0 :(得分:0)
" CalcPrice - 在
Product
中什么都不做,但在农场和水果中做了什么。"
是的,这足以证明Product
是一个抽象类
class Product {
public:
Money CalcPrice() const = 0;
void Print() {
// Output concrete members known in the abstract class here
std::cout << "'" << category_ << "', "
<< a_ << "', "
<< b_ << "', "
<< c_ << "', "
<< d_;
PrintExtensions(); // Allow derived classes to print additional stuff
std::cout << std::endl;
}
protected:
Product(char category, int a, int b, int c, int d)
: category_(category), a_(a), b_(b), c_(c), d_(d) {
}
virtual void PrintExtensions() {
// Does nothing in the base class
}
private:
char category_;
int a_;
int b_;
int c_;
int d_;
};
派生类应该看起来像这样
class FarmProduct : public Product {
public:
FarmProduct(int a, int b, int c, int d, std::string name)
: Product('A',a,b,c,d), name_(name)
virtual Money CalcPrice() const {
Money price;
// calculate the price and return
return price;
}
protected:
virtual void PrintExtensions() {
std::cout << ", '" << _name;
}
private:
std::string name_;
};
class FruitProduct : public FarmProduct {
public:
FruitProduct(int d, const std::string& name)
: FarmProduct(1, 2, 3, d, name) {
}
};
虽然你不能做像
这样的事情 Product pro(123, 'A', 1, 22, 1, 1);
。