没有指针的多态性
Polymorphism without pointers
我试图创建一个抽象类,并使用多态性来确定购买的付款方式。我尝试了一些不同的东西,但我仍然无法让它按照我想要的方式工作。这是代码:
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
可用,即使这样也会消失。
作为此设计的另一个好处,您现在可以轻松添加测试代码,例如模拟付款方式。
只需从购买类中删除PaymentMethod _paymentMethod
,您的Purchase
函数无论如何都会收到它。
另一件事,由于您将 const 引用传递给 Purchase
,Purchase
调用的所有函数都必须是 const:
virtual std::string getPaymentMethod() = 0;
-->
virtual std::string getPaymentMethod() const = 0;
相关文章:
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 具有智能指针的多态性
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 如何调用指针类型的方法(禁用多态性)?
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 如何避免指针超出范围(多态性)的C++分段错误
- C++ 被此代码与多态性、指针和对象切片混淆
- 在同时处理基类的多个指针时如何处理多态性?
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 与智能指针和矢量C 的多态性有关的问题
- C - 删除多态性指针
- 载体包含指向多态性类别的指针
- 集合中的智能指针多态性
- 多态性和STL容器.指针是不必要的
- 由支持多态性的值池存储,如何使用智能指针
- 如果我需要多态性,我应该使用原始指针而不是unique_ptr
- 没有指针的多态性
- 如何在使用动态多态性时避免指针
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分