在c ++中对象切片有哪些可行的解决方法?

yeg*_*256 7 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;
}
Run Code Online (Sandbox Code Playgroud)

预期的结果是B,但它是A.据我所知,物体切片正在发生.怎么避免呢?我应该存储指针vector而不是对象实例吗?这是唯一的选择吗?

sbi*_*sbi 13

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


Kor*_*icz 12

从最简单,最复杂(但最好)订购.

解决方案1:

vector<B> v;
v.push_back(B());
cout << v.at(0).f() << endl;
Run Code Online (Sandbox Code Playgroud)

解决方案2:

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

解决方案3:

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

如果您不希望切片发生,您需要考虑到不同对象可能具有不同大小的事实 - 因此您需要一个可以使用可变大小的解决方案 - 这使得必须在堆上存储.

  • `vector <std :: auto_ptr <A >> v;`真的很糟糕.永远不要将`auto_ptr`存储在向量中,因为它的副本ctor会修改传递的对象.请参阅:http://www.gotw.ca/publications/using_auto_ptr_effectively.htm. (2认同)