C++ 从基类c+的向量中的派生类调用虚方法+;
在类基类中,我有一个公共函数:C++ 从基类c+的向量中的派生类调用虚方法+;,c++,xcode,c++11,C++,Xcode,C++11,在类基类中,我有一个公共函数: virtual void Call(){}; void Call(){ cout << "whatever" << endl; }; 在派生类Archer中,我有以下函数: virtual void Call(){}; void Call(){ cout << "whatever" << endl; }; 调用call(),它按照我的意愿工作。我对C++很陌生,不能想出解决的办法。< p>当在堆栈上创建对象而
virtual void Call(){};
void Call(){ cout << "whatever" << endl; };
在派生类Archer中,我有以下函数:
virtual void Call(){};
void Call(){ cout << "whatever" << endl; };
调用call(),它按照我的意愿工作。我对C++很陌生,不能想出解决的办法。< p>当在堆栈上创建对象而不是堆时,继承的大部分值就会丢失。虚拟函数是您丢失的东西之一,如果您希望虚拟函数调用正确的函数,则必须将对象作为指针或引用传递,并使用
new
创建它
Base * b = new Derived(); // or
Base & b = * new Derived();
向量必须存储引用或指针
vector<BaseClass*> classes;
vector<BaseClass&> classes;
其中一个可以这样创建:
shared_ptr<BaseClass> ptr(new BaseClass);
shared_ptr ptr(新基类);
基本上,一个共享的ptr将处理恼人的内存管理任务
如果您需要对同一对象使用多个ptr,则共享ptr很好,如果不需要,则可以使用std::unique\u ptr
向量类代码>
创建如下内容:
unique_ptr ptr(新基类)代码>
正如您所见,语法与shared_ptr非常相似,因此转换很容易多态性仅适用于指针和引用。但是您从CharChoice
返回BaseClass
作为副本,并在将其推送到向量时创建另一个副本。每个副本都将对象切回一个基类
对象。*new T()
几乎总是一个错误。使用智能指针。鉴于问题被标记为C++11,我觉得在答案中有一句关于智能指针的话是非常可取的。@jogojapan我会给它一个答案你想选择unique\u ptr
而不是shared\u ptr
@Griwes你能解释一下为什么吗?@aaronman,性能低于shared\u ptr
。正确的语义。如果所有权是唯一的,请始终使用unique\ptr
,并且除非明确标记,否则始终假定所有权是唯一的。
vector<shared_ptr<BaseClass>> classes;
shared_ptr<BaseClass> ptr(new BaseClass);