我试图创建一个抽象类,并使用它通过多态性来确定购买的付款方式。我尝试了一些不同的方法,但仍无法按我的要求进行操作。这是代码:

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’

我猜我将不得不使用指针,对吗?

我以为除非使用长寿命的对象,否则应尽量避免使用newdelete,但是由于PaymentMethod是抽象类,因此无法将其用作类成员...我错了吗?

最佳答案

您应该尽量避免newdelete,这是绝对正确的。

就是这样:

#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/

10-13 05:53