我试图创建一个抽象类,并使用它通过多态性来确定购买的付款方式。我尝试了一些不同的方法,但仍无法按我的要求进行操作。这是代码:
class PaymentMethod {
public:
PaymentMethod() {}
virtual std::string getPaymentMethod() = 0;
};
class PayWithMoney : public PaymentMethod {
public:
PayWithMoney() {}
virtual std::string getPaymentMethod() {
std::string paymentMethod = "Payed with Money";
return paymentMethod;
}
};
class PayWithDebitCard : public PaymentMethod {
public:
PayWithDebitCard() {}
virtual std::string getPaymentMethod() {
std::string paymentMethod = "Payed with Debit Card";
return paymentMethod;
}
};
我还有另一个类:
class Purchase {
private:
something
PaymentMethod _paymentMethod;
public:
Purchase(something, const PaymentMethod& paymentMethod)
但是我不断收到编译器错误,说
cannot declare field ‘Purchase::_paymentMethod’ to be of abstract type ‘PaymentMethod’
。我猜我将不得不使用指针,对吗?
我以为除非使用长寿命的对象,否则应尽量避免使用
new
和delete
,但是由于PaymentMethod
是抽象类,因此无法将其用作类成员...我错了吗? 最佳答案
您应该尽量避免new
和delete
,这是绝对正确的。
就是这样:
#include <memory> // for std::unique_ptr
#include <utility> // for std::move
class Purchase
{
Purchase(std::unique_ptr<PaymentMethod> payment_method)
: payment_method_(std::move(payment_method))
{ }
std::unique_ptr<PaymentMethod> payment_method_;
public:
static Purchase MakeDebitCardPurchase()
{
return Purchase(std::make_unique<PayWithDebitCard>());
}
static Purchase MakeCashPurchase()
{
return Purchase(std::make_unique<PayWithCash>());
}
};
用法:
auto purchase = Purchase::MakeCashPurchase();
请注意
std::make_unique
尚不存在,因此您可能不得不说:return Purchase(std::unique_ptr<PaymentMethod>(new PayWithCash));
这是您唯一必须说
new
的时间,而且即使标准库中提供了std::make_unique
,它也将消失。作为此设计的另一个好处,您现在可以轻松添加测试代码,例如模拟付款方式。
关于c++ - 没有指针的多态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20661197/