在多态性 c++ 上使用常规指针
Using regular pointers on Polymorphism c++
我正在尝试学习 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);
}
我这样做是因为我想避免做“push.back”来添加我在调用构造函数时创建的每个对象(每次尝试使用智能指针或原始指针时我总是以调用结束再次使用相同的构造函数,然后创建一个无限循环)并实现多态性而不必担心这种情况下的内存泄漏,但我发现自己在使用虚函数时遇到了一些问题,我认为这可能与此有关。如果你们能告诉我这是否是个好主意,我将非常高兴,同时我要感谢你们的关注!
关于您最后的评论,是的,这是两个不同问题的例子。这种方法的主要问题是指针被放在一个向量中,而不管实际帐户对象在程序中的何处构造,这可能是完全不相关的情况。
因此,关注点分离 的原则意味着银行账户 class 应该只模拟某种类型银行账户的相关方面。例如,如果它将用于表示与银行客户关联的银行帐户列表,那么“客户”对象应该负责管理该列表。现在,我不确定您在使用智能指针时遇到了什么问题,但由于我建议在刚刚给出的示例中使用它们,因此这里有一个显示正确用法的片段:
#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));
我正在尝试学习 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);
}
我这样做是因为我想避免做“push.back”来添加我在调用构造函数时创建的每个对象(每次尝试使用智能指针或原始指针时我总是以调用结束再次使用相同的构造函数,然后创建一个无限循环)并实现多态性而不必担心这种情况下的内存泄漏,但我发现自己在使用虚函数时遇到了一些问题,我认为这可能与此有关。如果你们能告诉我这是否是个好主意,我将非常高兴,同时我要感谢你们的关注!
关于您最后的评论,是的,这是两个不同问题的例子。这种方法的主要问题是指针被放在一个向量中,而不管实际帐户对象在程序中的何处构造,这可能是完全不相关的情况。
因此,关注点分离 的原则意味着银行账户 class 应该只模拟某种类型银行账户的相关方面。例如,如果它将用于表示与银行客户关联的银行帐户列表,那么“客户”对象应该负责管理该列表。现在,我不确定您在使用智能指针时遇到了什么问题,但由于我建议在刚刚给出的示例中使用它们,因此这里有一个显示正确用法的片段:
#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));