指向继承类对象c ++的向量

时间:2016-01-24 17:37:54

标签: c++ inheritance vector

我有三个分支:

{abstract class}

B继承A

C继承A

我需要创建一个包含vector<A*> vect的类D,其中存储了B类和C类的对象。我的想法是创建classA指针并为它们分配classB和C对象的地址。从我收集的内容来看,这被称为向上转换?

但是,只有classA属性存储在向量中,继承的属性不是。

这是包含向量的类:

class D{
    vector<A*> vect;
public:
    MagazinVirtual& operator+=(A* obj){
        vect.push_back(obj);
        return *this;
    }
    friend ostream& operator<<(ostream& out, D &obj){
        vector<A*>::iterator it;
        for (it = obj.vect.begin(); it != obj.vect.begin(); ++it)
            out << **it << endl;
        return out;
    }
};

A类变量:

    class A{
        static int cod;
        char* denumire;
        int garantie;
        float pret;
        int stoc;
};

B组:

class B:public A{
    char* os;
    bool tipEcran;
    float diagonala;
};

C类:

class C:public A{
    int tipAccesoriu;

这里是我如何向向量添加对象:(不要向我发送可怕的名字和链接的构造函数调用,它是针对OOP类的,并且出于某种原因他们想要完全相同在main();

中调用
int main(){
    B t1, t2("nokia 231", 2, 27, 10, "and", 1, 4);
    //t1 = t2;
    C a1("Husa EH-17", 1, 2, 100, 0), a2("Card SD64", 1, 10, 100, 2), a3 = a2;

    D dvect;
    A *ptr1 = &t1;
    A *ptr2 = &a1;
    a += ptr1;
    a += ptr2;
    cout << a;
return 0;
}

当为A类使用重载的ostream运算符时,尽管向量中应该有2个元素(1B 1C),但它只打印出FIRST推送对象的classA属性,这是一个classB对象。在这种情况下,它打印出来:

nokia 231 / 2 / 27 / 10

这里是B类的ostream运算符:

friend ostream& operator<<(ostream &out, B&obj){
    out << (A&)obj << obj.os << endl <<obj.tipEcran
        <<endl<<obj.diagonala<<endl;
    return out;
}

对于C班:

friend ostream& operator<<(ostream &out, C &obj){
    out << (A&)obj << obj.tipAccesoriu << endl;
    return out;
}

对于长篇文章感到抱歉,如果它看起来像一个愚蠢的问题,但指针真的让我头晕目眩。感谢您的时间!

2 个答案:

答案 0 :(得分:3)

运行时多态性仅通过基类的虚函数发生。您的operator<<方法既不是虚方法也不是基类的成员。

通常的解决方案是仅为ostream& operator<<(ostream &out, A&obj)而不是AB定义C,但在该函数内部不要直接实现它。而是将ostream&作为参数传递给类的虚函数。如(内部A):

friend ostream& operator<<(ostream &out, A&obj){
    return A.serialize( out );
}
virtual ostream& serialize(ostream &out) { ... };

然后声明并定义:

ostream& B::serialize(ostream &out){
    A::serialize(out) << os << endl <<tipEcran
        <<endl<<diagonala<<endl;
    return out;
}

答案 1 :(得分:0)

+它只打印一行,因为条件不好,它会停止!做第一次迭代。

for (it = obj.vect.begin(); it != obj.vect.begin(); ++it)
                                           ^^^^^

通常,一个人放在那里

obj.vect.end()