C ++:在超类的向量中查找类的实例

时间:2015-06-20 12:14:13

标签: c++ boost vector polymorphism

我试图有一个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;
}

非常感谢:)

1 个答案:

答案 0 :(得分:1)

了解object slicing

简而言之:向量中的每个元素只有足够的空间来容纳<div class="title">Welcome to My Site!</div> <div class="title-small">My Site</div>个对象。当您card push_back个对象时,该对象的subcard部分会被“切片”掉,并变为subcard

没有办法找回丢失的信息。实际上,无法确定card最初是cardsubcard是否在此处不起作用。)

您需要在向量中存储引用指针以避免切片。在你的情况下,dynamic_cast<subcard*>(&(v1[i]))(因为你不能在矢量中存储原始引用)似乎是合适的。