关于我项目中的抽象类

时间:2015-01-03 00:57:09

标签: c++ class inheritance polymorphism abstract

我的项目中有以下课程:

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 - 可能是语法错误很少,我的母语不是英语:)

1 个答案:

答案 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);