This question already has answers here:
What is object slicing?
(17个答案)
4年前关闭。
我正在尝试一个boost :: container :: vector,其中包含几个类的实例,这些实例都从同一个超类继承,然后有一些功能仅适用于特定类的实例,但我似乎无法让它工作。
这是我第一次尝试,所以也许我只是犯了一个菜鸟错误,你们中的一个可以告诉我我哪里出错了,为什么?
这是一个示例代码:
非常感谢你 :)
(17个答案)
4年前关闭。
我正在尝试一个boost :: container :: vector,其中包含几个类的实例,这些实例都从同一个超类继承,然后有一些功能仅适用于特定类的实例,但我似乎无法让它工作。
这是我第一次尝试,所以也许我只是犯了一个菜鸟错误,你们中的一个可以告诉我我哪里出错了,为什么?
这是一个示例代码:
using boost::container::vector;
class card{
public:
card(int aa,int bb):a(aa),b(bb){}
virtual ~card(){}
int a,b;
};
bool operator==(card l, card r){ return l.a==r.a; }
bool operator<(card l, card r){
if(l.a<r.a){ return true;}
else{ return l.b<r.b; }
}
std::ostream& operator<<(std::ostream& os, card c){
os << c.a << ":" << c.b;
return os;
}
class subcard:public card{
public:
subcard(int a, int b):card(a,b){}
virtual ~subcard(){}
int c=0;
};
int main() {
cout << "Hello, World!" << endl;
vector<card> v1;
v1.push_back(card(2,2));
v1.push_back(subcard(1,1));
for (int i = 0; i < v1.size(); ++i) {
cout<<v1[i]<<endl;
}
for (int i = 0; i < v1.size(); ++i) {
if(subcard* sc = dynamic_cast<subcard*>(&(v1[i]))){
cout<< "found : " << sc <<endl;
}
}
return 0;
}
非常感谢你 :)
最佳答案
了解有关object slicing的信息。
简而言之:向量中的每个元素仅具有足够的空间来容纳card
对象。当您push_back
一个subcard
对象时,该对象的subcard
部分将被“切开”,并成为card
。
没有办法找回丢失的信息。实际上,无法确定card
最初是否是subcard
(即dynamic_cast<subcard*>(&(v1[i]))
在这里不起作用)。
您需要在向量中存储引用或指针,以避免切片。在您的情况下,std::vector<std::reference_wrapper<card>>
(因为您不能在向量中存储原始引用)似乎很合适。
10-08 19:14