Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从基类c+的向量中的派生类调用虚方法+;_C++_Xcode_C++11 - Fatal编程技术网

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);