【发布时间】: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