所以我有一个带字段名称和价格的抽象类产品。有一些类继承自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错误......
答案 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;
}