【发布时间】:2013-07-01 02:26:21
【问题描述】:
在 BaseClass 类中我有一个公共函数:
virtual void Call(){};
在派生类 Archer 内部,我有以下功能:
void Call(){ cout << "whatever" << endl; };
我还设置了一个矢量:
vector<BaseClass> classes;
其中我推送了从 BaseClass 派生的 3 个类。问题似乎(对我来说,我可能错了)是我从对 BaseClass 的引用调用 Call(),即使我通过以下方法将它们推入向量:
BaseClass Player::CharChoice(string character)
{
if(character == "Archer") return *new Archer();
else if(character == "Knight") return *new Knight();
else if(character == "Sorcerer") return *new Sorcerer();
else cerr << "CHARACTER NOT DEFINED" << endl;
};
for(int c = 0; c < chars.size(); c++)
{
classes.push_back(CharChoice(chars[c]));
}
如果我改为设置一个变量,例如:
Archer *archer = new Archer();
并调用 Call(),它会按照我的意图工作。我对 C++ 还很陌生,无法想出解决方案。
【问题讨论】:
-
多态性仅适用于指针和引用。但是您将
BaseClass作为来自CharChoice的副本返回,并且当您将其推送到向量时会制作另一个副本。每个副本都将对象切回BaseClass对象。 -
*new T()几乎总是一个错误。使用智能指针。