我将基类和派生类(Account、StudentAccount、EmployeeAccount)的对象存储在 STL 列表中,并使用 STL 迭代器处理它们。对象的动态多态行为没有发生。在阅读了这个论坛上的几篇文章后,对我来说“似乎”(因为我不太能够理解深层的技术原因)STL列表中的多态行为是不可能的。我想知道多态行为是否不可能,解决方法是什么?如果我的看法不正确,请分享链接或代码示例。我被困在原型中间。下面是主要代码部分: (使用 Visual Studio 2022 和 ISO C++ 14,控制台应用程序)
list<Account>* log = new list<Account>(); // in constructor
bool Bank::add(const Account& acc)
{
// do some checking here
this->log->push_back(Account(acc));
return true;
}
bool Bank::addAccount(...parameter here...)
{
return this->add(Account(...parameter here...));
}
bool Bank::addStudentAccount(...parameter here...)
{
return this->add(StudentAccount(...parameter here...));
}
list<Account>* log = new list<Account>()
这称为“切片”:如果将派生类放入该列表中,则实际上仅存储
Account
“子部分”。
解决这个问题的方法非常简单:存储指针。
std::list<std::unique_ptr<Account>>;
我认为上面的评论在一定程度上回答了你的问题。重复一遍,只有在使用指向基类的指针进行方法调用时才可能实现多态性 - 在本例中是“Account *”类型的指针
旁注 - 我强烈建议在将其与模板结合之前先尝试使用多态性来习惯这个想法。即使它只是一个原型,它也会让生活变得更加轻松。
祝您 C++ 之旅一切顺利!