抽象类的C ++输出运算符

时间:2014-11-22 13:32:44

标签: c++ class output operator-keyword abstract

所以我有一个带字段名称和价格的抽象类产品。有一些类继承自Product,而Product是抽象的原因是因为这些子类必须实现此功能(在Product中定义):

 virtual std::string getCategory()=0;

类别不是一个字段,它只取决于我们拥有哪个子类,在某些情况下取决于价格。

现在我想要Product的子类的输出操作符,但由于我只想打印名称和价格,我在Product.h中做了这个:

 friend std::ostream& operator<<(std::ostream& os, const Product& secondOperand);

这在Product.cpp中:

 ostream& operator<<(ostream& outputStream, Product& secondOperand){
     outputStream << "["<<secondOperand.getName()<<" "<<secondOperand.getPrice()<<"]"<<endl;
     return outputStream;
 }

现在我在visual studio中遇到了这个错误:

Error C2259: 'Product' : cannot instantiate abstract class

我不想为每个子类实现此输出(因此我必须逐字复制不理想的所有内容)。另外,我开始使用Product不是纯虚拟的,但后来我的getCategory()函数出现了Linker错误......

1 个答案:

答案 0 :(得分:0)

这种方法没有错,这是一个编译和运行的样本....

#include <string>
#include <iostream>

using namespace std;

class Product
{
public:
    friend std::ostream& operator<<(std::ostream& os, const Product& secondOperand);
    virtual ~Product() = 0;

    string getName() { return "Product Name"; }
    string getPrice() {return "£1.00"; }
    virtual std::string getCategory()=0;
};

ostream& operator<<(ostream& outputStream, Product& secondOperand){
     outputStream << "["<<secondOperand.getName()<<" "<<secondOperand.getPrice()<<"]"<<endl;
     return outputStream;
 }

Product::~Product() {}

class DerivedProduct : public Product
{
public:
    DerivedProduct() {}
    std::string getCategory() { return "Derived getCategory()"; }
};

int main(int argc, char *argv[])
{
    DerivedProduct d;
    cout << d.getCategory() << endl;
    cout << d << endl;
    return 0;
}