3

在 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++ 还很陌生,无法想出解决方案。

4

1 回答 1

4

当您在堆栈而不是堆上创建对象时,继承的大部分价值都会丢失。虚函数是您丢失的东西之一,如果您希望虚函数调用正确的函数,您必须将对象作为指针或引用传递并用于new创建它。

Base * b = new Derived();    // or  
Base & b = * new Derived();  

向量必须存储引用或指针。

vector<BaseClass*> classes;
vector<BaseClass&> classes;

根据大众的需求,处理这个问题的最简单方法是std::shared_ptr

vector<shared_ptr<BaseClass>> classes;

其中之一将像这样创建:

shared_ptr<BaseClass> ptr(new BaseClass);

基本上一个 shared_ptr 将处理烦人的内存管理任务

如果您需要多个 ptr 到同一个对象,shared_ptr 很好,如果不需要,您可以使用std::unique_ptr

vector<unique_ptr<BaseClass>> classes;

像这样创建:

unique_ptr<BaseClass> ptr(new BaseClass);

如您所见,语法与 shared_ptr 非常相似,因此转换很容易

于 2013-07-01T02:30:46.520 回答