【问题标题】:Vector of pointers to inherited class objects c++指向继承的类对象的指针向量c ++
【发布时间】:2016-04-30 23:10:48
【问题描述】:

我有三个类:

A{ 抽象类 }

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),但它只打印出第一个推送对象的 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;
}

抱歉,这篇文章太长了,如果这似乎是一个愚蠢的问题,但指针真的让我头晕目眩。感谢您的时间!

【问题讨论】:

  • 一般建议:不要使用原始指针,而是使用smart pointers

标签: c++ inheritance vector


【解决方案1】:

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

通常的解决方案是只为A 定义ostream&amp; operator&lt;&lt;(ostream &amp;out, A&amp;obj) 而不是为BC 但在该函数内部不要直接实现它。而是让它将ostream&amp; 作为参数传递给类的虚函数。如(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;
}

【讨论】:

  • 好的,这是一个全新的概念。因此,在我的 A 类中,我像以前一样摆脱了 operator
  • 好的,我明白了!我像往常一样做事情,而不是返回,而是返回。这太棒了!
【解决方案2】:

+因为条件不好所以只打印一行,之前就停止了!进行第一次迭代。

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

通常,一个人放在那里

obj.vect.end()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2017-07-30
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多