在多态性c++上使用常规指针

Using regular pointers on Polymorphism c++

本文关键字:常规 指针 多态性 c++      更新时间:2024-09-27

我正在尝试学习C++中的多态性,我学习它的方式是使用原始指针或智能指针,但这次我一直在尝试使用常规指针,我甚至尝试从构造函数中添加指向向量的指针,如下所示:

std::vector<bank_account*> bank_accounts; 
bank_account::bank_account(std::string Name, int Balance)
: name{Name}, password{create_random_passowrd()}, balance{Balance}, Id{create_ID()} {}
saving_account::saving_account(std::string Name, int Balance, float Interest)
: bank_account{Name, Balance}, interest_rate{Interest}{
bank_account *ptr = this;
bank_accounts.push_back(ptr);
}

我这样做是因为我想避免做";推回;在调用构造函数时添加我创建的每一个对象(我对智能指针或原始指针的每一次尝试都会再次调用同一个构造函数,然后创建一个无限循环(,并且在这种情况下实现多态性而不必担心内存泄漏,但我发现自己在使用虚拟函数时遇到了一些问题,我认为这可能与此有关。如果你们能告诉我这是不是一个好主意,我真的很高兴,我也要感谢你们的关注!

对于您的最后一条评论,是的,这是两个不同关注点的例子。这种方法的主要问题是,指针被放在一个向量中,而不管程序中的实际帐户对象是在哪里构建的,这可能是完全不相关的情况。

因此,关注点分离的原则意味着银行账户类应该只是对某种类型的银行账户的相关方面进行建模。例如,如果它将用于表示与银行客户相关联的银行账户列表,那么它应该是"客户"的责任;客户端";对象来管理该列表。现在,我不确定您在使用智能指针时遇到了什么问题,但由于我建议在刚才给出的示例中使用它们,因此这里有一个片段显示了正确的用法:

#include "bank_account.h"
#include <memory>
#include <vector>
class Client
{
using account_ptr = std::unique_ptr<bank_account>;
std::vector<account_ptr> m_accounts;
// ...
};

std::make_unique可以添加不同的帐户类型,自C++14:起可用

m_accounts.emplace_back(std::make_unique<bank_account>("A", 100));
m_accounts.emplace_back(std::make_unique<savings_account>("B", 2000, 0.5));