繁体   English   中英

在c ++中进行对象切片的可能解决方法是什么?

[英]What is a possible workaround for object slicing in c++?

这是代码:

#include <string>
#include <vector>
#include <iostream>
using namespace std;
class A {
public:
  virtual const string f() const { return "A"; }
};
class B : public A {
public:
  const string f() const { return "B"; }
};
int main(int ac, char** av) {
  vector<A> v;
  v.push_back(B());
  cout << v.at(0).f() << endl;
  return 0;
}

预期的结果是B ,但是它是A 据我了解, 对象切片正在发生。 如何避免呢? 我应该将指针存储在vector而不是对象实例中吗? 这是唯一的选择吗?

您需要存储指针。 如果这些引用动态分配的对象,请使用智能指针

从最简单到最复杂(但最漂亮)的顺序。

解决方案1:

vector<B> v;
v.push_back(B());
cout << v.at(0).f() << endl;

解决方案2:

vector<A*> v;
v.push_back(new B());
cout << v.at(0)->f() << endl;
while(!v.empty()) { delete v.back(); v.pop_back(); }

解决方案3:

vector<boost::shared_ptr<A>> v;
v.push_back(boost::make_shared<B>());
cout << v.at(0)->f() << endl;

如果您不希望进行切片,则需要考虑以下事实:不同的对象可能具有不同的大小-因此,您需要一个可以使用可变大小的解决方案-因此必须在堆上进行存储。

好吧,在您的代码中,您可以使用B的向量。请注意,只有通过指针或引用调用虚拟函数,才能正确分派虚函数。 但是,假设您确实希望向量同时包含A和B对象,则需要使其成为A指针的向量,并动态创建A和B对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM